2013-04-13 4 views
15

Ich würde gerne wissen, wie ich eine endgültigeException, die eine Detailnachricht mit allen Detailmeldungen einer Reihe von verketteten Ausnahmen enthält.Erhalten Sie Detailnachrichten von verketteten Ausnahmen Java

Zum Beispiel nehme an, einen Code wie folgt:

try { 
    try { 
    try { 
     try { 
     //Some error here 
     } catch (Exception e) { 
     throw new Exception("FIRST EXCEPTION", e); 
     } 
    } catch (Exception e) { 
     throw new Exception("SECOND EXCEPTION", e); 
    } 
    } catch (Exception e) { 
    throw new Exception("THIRD EXCEPTION", e); 
    } 
} catch (Exception e) { 
    String allMessages = //all the messages 
    throw new Exception(allMessages, e); 
} 

ich im vollen stackTrace bin nicht interessiert, sondern nur in den Nachrichten, die ich geschrieben habe. Ich meine, würde Ich mag ein Ergebnis wie dieses haben:

java.lang.Exception: THIRD EXCEPTION + SECOND EXCEPTION + FIRST EXCEPTION 

Antwort

22

Ich denke, was Sie brauchen, ist:

public static List<String> getExceptionMessageChain(Throwable throwable) { 
    List<String> result = new ArrayList<String>(); 
    while (throwable != null) { 
     result.add(throwable.getMessage()); 
     throwable = throwable.getCause(); 
    } 
    return result; //["THIRD EXCEPTION", "SECOND EXCEPTION", "FIRST EXCEPTION"] 
} 
+0

Hervorragende Lösung, thanx! Andere Vorschläge waren auch gut, aber auf diese Weise habe ich den Code in einer einzigen Methode zentralisiert, und ich muss nur die Methoden modifizieren, von denen ich die * final * 'Exception' geworfen habe ... – MikO

1

Sie können besser auf diese Weise verwenden, fusionieren die message() früherer Exception mit dem message() neuer Exception Sie sind throw ing:

 } catch (Exception e) { 
      throw new Exception("FIRST EXCEPTION" + e.getMessage(), e); 
     } 
1

Durchlaufen Sie die Ausnahmeursache und hängen Sie die Nachricht an jede Ausnahme an.

try 
    { 
     try 
     { 
      try 
      { 
       try 
       { 
        throw new RuntimeException("Message"); 
       } 
       catch (Exception e) 
       { 
        throw new Exception("FIRST EXCEPTION", e); 
       } 
      } 
      catch (Exception e) 
      { 
       throw new Exception("SECOND EXCEPTION", e); 
      } 
     } 
     catch (Exception e) 
     { 
      throw new Exception("THIRD EXCEPTION", e); 
     } 
    } 
    catch (Exception e) 
    { 
     String message = e.getMessage(); 
     Throwable inner = null; 
     Throwable root = e; 
     while ((inner = root.getCause()) != null) 
     { 
      message += " " + inner.getMessage(); 
      root = inner; 
     } 
     System.out.println(message); 
    } 

Welche druckt

DRITTE AUSNAHME zweite Ausnahme FIRST AUSNAHME Nachricht

1

Sie können nur die vorherige Ausnahmemeldung hinzufügen für jede Ausnahme

Diese

ist ein Beispiel:

public static void main(String[] args) { 

    try { 
     try { 
      try { 
       try { 
        throw new Exception(); 
        // Some error here 
       } catch (Exception e) { 
        throw new Exception("FIRST EXCEPTION", e); 
       } 
      } catch (Exception e) { 
       Exception e2 = new Exception("SECOND EXCEPTION + " + e.getMessage()); 
       throw e2; 
      } 
     } catch (Exception e) { 
      Exception e3 = new Exception("THIRD EXCEPTION + " + e.getMessage()); 
      throw e3; 
     } 
    } catch (Exception e) { 
     System.out.println(e); 
    } 
} 

Das Ergebnis ist: java.lang.Exception: THIRD AUSNAHME + ZWEITE AUSNAHME + FIRST AUSNAHME