2009-08-18 29 views
10

Java e.printStackTrace() không in tất cả các chi tiết của dấu vết ngăn xếp của ngoại lệ bên trong.Nhận chuỗi dấu vết đầy đủ bao gồm cả ngoại lệ bên trong

Có cách nào sẵn sàng để tạo dấu vết ngăn xếp hoàn chỉnh ở dạng chuỗi không? (Ngoài định dạng nó bản thân mình)

Sửa

Tôi chỉ phát hiện ra những gì printStackTrace() không - rõ ràng là ngăn xếp khung nó lọc ra là chính xác những cái chung cho ngoại lệ bên trong và một bên ngoài. Vì vậy, trên thực tế nó là thay vì những gì tôi muốn, và không phải là dấu vết ngăn xếp 'đầy đủ'.

+0

Làm thế nào để bạn có nghĩa là - stack trace nội ngoại lệ không? Là một ngoại lệ bị bắt được tuyên truyền trong trường hợp ngoại lệ khác? – Everyone

+0

Cái gì đó được tạo ra bởi một nắm bắt ... ném ngoại lệ mới ("foo", e) – ripper234

+0

Tôi chỉ phát hiện ra những gì printStackTrace() không - dường như các khung ngăn xếp nó lọc ra là chính xác những cái chung cho ngoại lệ bên trong và bên ngoài một. Vì vậy, trên thực tế nó là thay vì những gì tôi muốn, và không phải là dấu vết ngăn xếp 'đầy đủ'. – ripper234

Trả lời

8

tôi đã kết thúc cán của riêng tôi (tôi đã thực hiện Throwable.printStackTrace() và tinh chỉnh nó một chút):

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

Tôi khuyên bạn nên sử dụng lớp ExceptionUtils từ Apache Commons lang, cung cấp phương pháp hữu ích cho điều đó.

+0

Trên thực tế, getFullStacktrace() vẫn không in dấu vết ngăn xếp bên trong. – ripper234

+0

Thật không may, không có phương thức printFullStacktrace(), nhưng bạn có thể thực hiện System.err.println (getFullStacktrace()); – romaintaz

+0

Liên kết bị gỡ xuống ... – Pacerier

2

Có, bạn có thể sử dụng lớp StackTraceElement được Throwable.getStackTrace() trả lại và tìm chi tiết.

Từ API:

Yếu tố cuối cùng của mảng (giả sử chiều dài của mảng là khác không) thể hiện dưới cùng của ngăn xếp, mà là lần đầu tiên phương pháp gọi trong chuỗi.

+0

Làm cách nào để không tự định dạng bản thân? – ripper234

+0

có, tùy chọn này không giải quyết phần định dạng. – techzen

Các vấn đề liên quan