2009-08-18 5 views
10

В e.printStackTrace() Java не печатаются все детали трассировки стека внутреннего исключения.Получение полной строки трассировки стека, включая внутреннее исключение

Есть ли готовый способ создания полной трассировки стека в виде строки? (Кроме того, форматирование его сам)

Редактировать

Я только что узнал, что делает printStackTrace() - по-видимому, стопка кадры он отфильтровывает ровно те общие для внутреннего исключения и внешней. Поэтому на самом деле это скорее то, что я хочу, а не «полный» трассировка стека.

+0

Как вы имеете в виду - трассировки стека внутреннего исключения в? Является ли исключение пойманным в другом исключении? – Everyone

+0

Что-то, что вызывается catch ... throw new Exception («foo», e) – ripper234

+0

Я только что узнал, что делает printStackTrace() - по-видимому, фильтры стека, которые он фильтрует, являются точно такими же, что и для внутреннего исключения и внешнего один. Поэтому на самом деле это скорее то, что я хочу, а не «полный» трассировка стека. – ripper234

ответ

8

я в конечном итоге прокатки мой собственный (я взял реализацию Throwable.printStackTrace() и отлажены это немного):

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

Я предлагаю вам использовать класс ExceptionUtils из Apache Commons lang, который предоставляет полезный метод для этого.

+0

На самом деле getFullStacktrace() по-прежнему не печатает внутреннюю трассировку стека. – ripper234

+0

К сожалению, нет метода printFullStacktrace(), но вы можете сделать System.err.println (getFullStacktrace()); – romaintaz

+0

Ссылка отсутствует ... – Pacerier

2

Да, вы можете использовать класс StackTraceElement, возвращаемый Throwable.getStackTrace(), и найти детали.

Из API:

Последний элемент массива (предполагается, что длину массива является не ноль) представляет собой нижнюю часть стека, который является первым методом вызова в последовательности.

+0

Как это не «форматирование»? – ripper234

+0

Да, этот параметр не касается части форматирования. – techzen

Смежные вопросы