2009-08-18 32 views
10

Funkcja e.printStackTrace() języka Java nie wyświetla wszystkich szczegółów śledzenia stosu wewnętrznego wyjątku.Uzyskiwanie pełnego śledzenia stosu ciągu zawierającego wyjątek wewnętrzny

Czy istnieje gotowy sposób wygenerowania kompletnego śledzenia stosu w postaci ciągu? (Oprócz formatowania to sam)

Edit

Właśnie się dowiedziałem, co printStackTrace() robi - widocznie stos klatek to odfiltrowuje są dokładnie te wspólne z wewnętrzną i zewnętrzną wyjątkiem jednego. W rzeczywistości jest to raczej to, czego chcę, a nie "pełny" ślad stosu.

+0

Jak masz na myśli - wewnętrzny wyjątek w ślad stosu? Czy wychwycony wyjątek jest propagowany w innym wyjątku? – Everyone

+0

Coś, co jest produkowane przez catch ... throw new Exception ("foo", e) – ripper234

+0

Właśnie dowiedziałem się, co robi printStackTrace() - najwyraźniej klatki stosów, które zostały odfiltrowane, są dokładnie tymi, które są wspólne dla wewnętrznego wyjątku i zewnętrznego jeden. W rzeczywistości jest to raczej to, czego chcę, a nie "pełny" ślad stosu. – ripper234

Odpowiedz

8

skończyło się toczenia własne (wziąłem realizację Throwable.printStackTrace() i manipulowane mu bitowy):

public static String joinStackTrace(Throwable e) { 
    StringWriter writer = null; 
    try { 
     writer = new StringWriter(); 
     joinStackTrace(e, writer); 
     return writer.toString(); 
    } 
    finally { 
     if (writer != null) 
      try { 
       writer.close(); 
      } catch (IOException e1) { 
       // ignore 
      } 
    } 
} 

public static void joinStackTrace(Throwable e, StringWriter writer) { 
    PrintWriter printer = null; 
    try { 
     printer = new PrintWriter(writer); 

     while (e != null) { 

      printer.println(e); 
      StackTraceElement[] trace = e.getStackTrace(); 
      for (int i = 0; i < trace.length; i++) 
       printer.println("\tat " + trace[i]); 

      e = e.getCause(); 
      if (e != null) 
       printer.println("Caused by:\r\n"); 
     } 
    } 
    finally { 
     if (printer != null) 
      printer.close(); 
    } 
} 
9

Proponuję użyć klasy ExceptionUtils z Apache Commons lang, co zapewnia przydatną metodę.

+0

W rzeczywistości funkcja getFullStacktrace() nadal nie drukuje śledzenia stosu wewnętrznego. – ripper234

+0

Niestety, nie ma metody printFullStacktrace(), ale można wykonać System.err.println (getFullStacktrace()); – romaintaz

+0

Link jest wyłączony ... – Pacerier

2

Tak można użyć klasy StackTraceElement zwróconej przez Throwable.getStackTrace() i znaleźć szczegóły.

Z API:

Ostatnim elementem układu (przy założeniu, że długość tablicy jest niezerowa) stanowi dno stosie, która to pierwsza metoda wywołania w sekwencji.

+0

Jak to się nie "formatuje sam"? – ripper234

+0

tak, ta opcja nie dotyczy części formatującej. – techzen

Powiązane problemy