Ich habe einen kleinen Code, der einige Transaktionen zur Verarbeitung durchläuft. Jede Transaktion ist mit einer Transaktionsnummer gekennzeichnet, die von einem externen Programm generiert wird und nicht unbedingt sequenziert ist. Wenn ich im Verarbeitungscode eine Ausnahme fange, lade ich sie an die Hauptklasse weiter und protokolliere sie zur späteren Überprüfung. Ich möchte die Transaktionsnummer zu dieser ausgelösten Ausnahme hinzufügen. Ist es möglich, dies unter Beibehaltung der korrekten Stapelablaufverfolgung durchzuführen?
Zum Beispiel:
public static void main(String[] args) {
try{
processMessage();
}catch(Exception E){
E.printStackTrace();
}
}
private static void processMessage() throws Exception{
String transNbr = "";
try{
transNbr = "2345";
throw new Exception();
}catch(Exception E){
if(!transNbr.equals("")){
//stack trace originates from here, not from actual exception
throw new Exception("transction: " + transNbr);
}else{
//stack trace gets passed correctly but no custom message available
throw E;
}
}
}
Versuchen:
throw new Exception("transction: " + transNbr, E);
Ausnahmen sind normalerweise unveränderlich: Sie können ihre Nachricht nach ihrer Erstellung nicht mehr ändern. Was Sie jedoch tun können, sind Kettenausnahmen:
throw new TransactionProblemException(transNbr, originalException);
Die Stapelverfolgung wird wie folgt aussehen
TransactionProblemException : transNbr
at ...
at ...
caused by OriginalException ...
at ...
at ...
Es gibt einen Exception
-Konstruktor, der auch das Ursachenargument übernimmt: Exception (String-Nachricht, Throwable t)
Sie können es verwenden, um den Stacktrace zu verbreiten:
try{
//...
}catch(Exception E){
if(!transNbr.equals("")){
throw new Exception("transaction: " + transNbr, E);
}
//...
}
sie können Super verwenden, während Sie Exception erweitern
if (pass.length() < minPassLength)
throw new InvalidPassException("The password provided is too short");
} catch (NullPointerException e) {
throw new InvalidPassException("No password provided", e);
}
// A custom business exception
class InvalidPassException extends Exception {
InvalidPassException() {
}
InvalidPassException(String message) {
super(message);
}
InvalidPassException(String message, Throwable cause) {
super(message, cause);
}
}
}
Sie können Ihre Ausnahmemeldung verwenden, indem Sie: -
public class MyNullPointException extends NullPointerException {
private ExceptionCodes exceptionCodesCode;
public MyNullPointException(ExceptionCodes code) {
this.exceptionCodesCode=code;
}
@Override
public String getMessage() {
return exceptionCodesCode.getCode();
}
public class enum ExceptionCodes {
COULD_NOT_SAVE_RECORD ("cityId:001(could.not.save.record)"),
NULL_POINT_EXCEPTION_RECORD ("cityId:002(null.point.exception.record)"),
COULD_NOT_DELETE_RECORD ("cityId:003(could.not.delete.record)");
private String code;
private ExceptionCodes(String code) {
this.code = code;
}
public String getCode() {
return code;
}
}
Der folgende Code ist ein einfaches Beispiel, das für mich funktioniert hat. Lassen Sie mich die Funktion main
als übergeordnete Funktion und divide
als untergeordnete Funktion aufrufen.
Grundsätzlich bin ich eine neue Ausnahme mit meiner benutzerdefinierten Nachricht(für den Aufruf der Eltern), wenn eine Ausnahme in der untergeordneten Funktion auftritt, indem die Ausnahme zuerst im untergeordneten Objekt abfängt.
class Main {
public static void main(String args[]) {
try{
long ans=divide(0);
System.out.println("answer="+ans);
}
catch(Exception e){
System.out.println("got exception:"+e.getMessage());
}
}
public static long divide(int num) throws Exception{
long x=-1;
try {
x=5/num;
}
catch (Exception e){
throw new Exception("Error occured in divide for number:"+num+"Error:"+e.getMessage());
}
return x;
}
}
die letzte Zeile return x
wird nicht ausgeführt, wenn irgendwo dazwischen ein Fehler auftritt.