it-swarm.com.de

Fügen Sie eine benutzerdefinierte Nachricht hinzu, um eine Ausnahme auszulösen, während Sie die Stack-Ablaufverfolgung in Java beibehalten

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;
        }
    }
}
44
thedan

Versuchen:

throw new Exception("transction: " + transNbr, E); 
75
Boris Pavlović

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 ...
13
JB Nizet

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); 
    }
    //...
}
7
dcernahoschi

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);
}

}

}

Quelle

2
oak

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;
    }
}
0
Emad Aghayi

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.

0
ansh sachdeva