2012-09-24 13 views
33

Mam mały fragment kodu, który wykonuje niektóre transakcje do przetworzenia. Każda transakcja jest oznaczona numerem transakcji, który jest generowany przez program zewnętrzny i niekoniecznie jest sekwencjonowany. Kiedy przechwycę wyjątek w kodzie przetwarzania, wrzucam go do głównej klasy i loguję do późniejszej recenzji. Chciałbym dodać numer transakcji do tego wyrzuconego wyjątku. Czy można to zrobić, zachowując jednocześnie prawidłowy ślad stosu?Dodanie niestandardowego komunikatu do wyjątku przy zachowaniu śledzenia stosu w Javie

na przykład:

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

Odpowiedz

56

Spróbuj:

throw new Exception("transction: " + transNbr, E); 
+1

To jest dokładnie to, czego szukałem. Dzięki. – thedan

6

Jest konstruktor Exception że bierze również argument przyczyna: Exception(String message, Throwable t)

Można go używać do propagowania StackTrace:

try{ 
    ... 
}catch(Exception E){ 
    if(!transNbr.equals("")){ 
     throw new Exception("transction: " + transNbr, E); 
    } 
    ... 
} 
12

Wyjątki są zwykle niezmienne: nie można zmienić ich wiadomości po ich utworzeniu. Co można zrobić, jest jednak wyjątki Łańcuch:

throw new TransactionProblemException(transNbr, originalException); 

Ślad stosu będzie wyglądać

TransactionProblemException : transNbr 
at ... 
at ... 
caused by OriginalException ... 
at ... 
at ... 
+1

To jest ładniejsze, ponieważ nazwa klasy wyjątku jest powiązana z domeną - od razu można rozpoznać dokładnie źródło problemu. Narzędzia do analizy kodu mogą podnosić ostrzeżenia, gdy "wyrzucisz nowy wyjątek (...)". – vikingsteve

0

można używać komunikat wyjątku przez: -

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

można użyć super podczas rozszerzania wyjątek

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

}

}

source

Powiązane problemy