2010-02-11 37 views
19

Tôi có một chức năng chung mà in trường hợp ngoại lệ (sử dụng log4j):Làm thế nào để hiển thị dấu vết ngăn xếp trên một ngoại lệ bị bắt?

private void _showErrorMessage(Exception e) { 
    log.error(e.getClass() + ": " + e.getMessage() + ": " + e.getCause() + "\n" + e.getStackTrace().toString()); 
} 

Thay vì nhìn thấy những vết đống tôi nhìn thấy:

[Ljava.lang.StackTraceElement;@49af7e68 

Làm thế nào tôi có thể xem stack trace của ngoại lệ đúng không?

cập nhật

log.error (e) < - hiển thị lỗi, nhưng không hiển thị stack trace

+8

Gọi 'log.error (e)' trong log4j gọi phiên bản sai của phương thức (http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/Category.html#error% 28java.lang.Object% 29). JavaDoc cho phương thức này thậm chí còn đề cập đến thực tế đó: "CẢNH BÁO Lưu ý rằng việc chuyển một Throwable sang phương thức này sẽ in tên của Throwable nhưng không có dấu vết stack. Để in dấu vết stack, hãy sử dụng biểu mẫu lỗi (Object, Throwable)." –

+5

call log.error (e, e) sẽ thực hiện công việc;) – Guillaume

Trả lời

12

tôi sẽ sử dụng các ExceptionUtils#getFullStackTrace của jakarta commons lang

+0

chính xác những gì tôi cần, cảm ơn rất nhiều !!!!!!!!!!!!!!! – ufk

+4

Liên kết bị hỏng !!! ahhh xin vui lòng chỉ đăng câu trả lời thay vì tham khảo các trang web khác. – codemonkey

+2

@codemonkey, bạn có thể tự tìm kiếm cho ExceptionUtils trong công cụ tìm kiếm yêu thích của bạn: câu trả lời của tôi là sử dụng thư viện hiện có. Tôi không thể duy trì tất cả các liên kết tôi đã đăng trong SO. Bây giờ, câu trả lời từ Joachim âm thanh tốt hơn so với tôi :) Xin vui lòng đọc nó. – Guillaume

4

Throwable.getStackTrace trả về một mảng của StackTraceElement s, vì thế mà phương pháp toString đang trở lại một đại diện văn bản của chính mảng đó.

Để thực sự truy xuất thông tin theo dõi ngăn xếp, người ta phải xem qua từng số StackTraceElement để biết thêm thông tin.

62

khung đăng nhập của bạn nên có khả năng đăng nhập ngoại lệ, vì vậy chỉ đơn giản là đi qua các ngoại lệ đối với .error(Object, Throwable) gọi thích hợp nên đủ:

I f khung đăng nhập của bạn không thể làm điều đó, hoặc bạn cần theo dõi ngăn xếp trong một String vì bất kỳ lý do nào khác, sau đó nó trở nên khó hơn một chút. Bạn sẽ phải tạo ra một gói PrintWriter một StringWriter và gọi .printStackTrace() trên Exception:

StringWriter sw = new StringWriter(); 
ex.printStackTrace(new PrintWriter(sw)); 
String stacktrace = sw.toString(); 
+0

khi tôi chuyển ngoại lệ sang log.error, nó chỉ hiển thị thông báo lỗi không có dấu vết ngăn xếp. sử dụng log4j – ufk

+1

Điều đó có nghĩa là bạn đã gọi nhầm phiên bản. Có lỗi '(Object)' và '(Object, Throwable)'. Gọi phiên bản đầu tiên có hiệu quả sẽ gọi là 'toString()'. –

+2

-1 - log4j có thể làm điều đó, anh ta chỉ gọi phương pháp sai. –

13

bạn đã thử?

private void _showErrorMessage(Exception e) { 
    log.error("Hey! got an exception", e); 
} 
+0

+1 cho giải pháp này dễ dàng và sạch sẽ nhất! – DerekY

4

Bạn cũng có thể xem thư viện Guava từ Google.

Throwables.getStackTraceAsString(Throwable throwable)

1

Câu trả lời chính xác cho câu hỏi của bạn là bạn nên gọi Log4J như thế này:

private void _showErrorMessage(Exception e) { 
    log.error(e.getClass() + ": " + e.getMessage() + ": " + e.getCause(), e); 
} 

Mặc dù tôi sẽ phân chia với các cuộc gọi đến e.getCause() vì stacktrace sẽ cho rằng cho bạn anyway, do đó:

private void _showErrorMessage(Exception e) { 
    log.error(e.getClass() + ": " + e.getMessage(), e); 
} 

Ngoại lệUếu bạn thực sự cần một chuỗi ngăn xếp, nhưng vì bạn đang sử dụng Log4J, bạn lo se rất nhiều bằng cách không sử dụng được xây dựng trong xử lý ngoại lệ của nó.

1

Exception Stacktrace logging hiển thị hai phương pháp cho mục đích này, một phương pháp dựa trên Apache Commons và một phương pháp khác bằng phương pháp JDK chuẩn.

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