2009-01-13 23 views
66

Rất nhiều lần trong nhật ký Java tôi sẽ nhận được một cái gì đó như:Làm thế nào để ngăn chặn stacktraces cắt xén trong nhật ký

Caused by: java.sql.BatchUpdateException: failed batch 
    at org.hsqldb.jdbc.jdbcStatement.executeBatch(jdbcStatement.java:1102) 
    at org.hsqldb.jdbc.jdbcPreparedStatement.executeBatch(jdbcPreparedStatement.java:514) 
    at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48) 
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:242) 
    ... 113 more 

Có ai biết làm thế nào để có được đầy đủ các stacktrace thể hiện (ví dụ: hiển thị 113 dòng khác)?


JavaDocs (for Java 7) cho tính năng Throwable có giải thích khá chi tiết về những gì đang diễn ra.

Trả lời

66

Khi bạn thấy '... thêm 113', điều đó có nghĩa là các dòng còn lại của ngoại lệ 'gây ra bởi' giống hệt với các dòng còn lại từ điểm đó trên ngoại lệ gốc.

Ví dụ, bạn sẽ phải

com.something.XyzException 
    at ... 
    at ... 
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:242) 
    at ... <the other 113 lines are here>... 
Caused by: <the above>. 

Hai đống dấu vết 'đáp ứng' tại AbstractBatcher.executeBatch, đường 242, và sau đó từ đó trở đi các dấu vết cuộc gọi trở lên là giống như các gói ngoại lệ.

+0

Cái gì? Nguyên nhân là giống như ngoại lệ gói? Tôi đã không có nó ... Các couse nên hiển thị dòng nơi mà vấn đề là từ, những gì nó không hiển thị khi cắt bớt stacktrace. Tôi đang gặp vấn đề này và muốn hiểu câu trả lời này, nếu ai đó có thể cải tổ nó ... Cảm ơn!Nhân tiện, câu trả lời này dường như không thể hiện cách in toàn bộ stacktrace. –

+20

@TomBrito bạn ĐANG đang thấy toàn bộ stacktrace - bạn có hai ngoại lệ, một bên trong khác. Nếu dấu vết ngăn xếp của ngoại lệ bên trong (bọc) là ABCDEFG và dấu vết ngăn xếp của ngoại lệ là ABCZ, thì bạn sẽ thấy OuterException với dấu vết ngăn xếp ZCBA, "gây ra bởi" InnerException với dấu vết ngăn xếp "GFEDC ... ' sau đó thêm 2 nữa ''. Hai cái đó là A và B, từ dấu vết ngăn xếp bên ngoài, và chúng được cho là ngắn gọn. – Cowan

19

Apache Commons Lang cung cấp phương pháp util đẹp ExceptionUtils.printRootCauseStackTrace() để in một chồng xếp chồng lồng nhau 'lộn ngược'. Kết quả trực quan hơn nhiều.

Nếu bạn thấy kết quả bên cạnh bản gốc nằm ngoài phương thức printStackTrace(), thì sẽ rõ ràng nơi các dòng 'thêm 113' đã đi.

-2

Trong bài đăng trên blog tôi vừa mô tả how to get more than just "BatchUpdateException: failed batch": đặt hibernate.jdbc.factory_class=org.hibernate.jdbc.NonBatchingBatcherFactory để vô hiệu hóa tính năng theo đợt trong chế độ ngủ đông. Thông thường người ta có thể sử dụng BatchUpdateException.getNextException để có lý do thất bại, nhưng trong một số trường hợp, điều này có thể trả về null. Sau đó, nó rất hữu ích để vô hiệu hóa việc tạo nhóm hoàn toàn.

+0

Điều này không trả lời được câu hỏi. Nó có thể giải quyết tình huống của anh ta trong cuộc sống thực, vì vậy việc thêm nó như là một bình luận cho câu hỏi của anh ta có thể hữu ích hơn việc đăng câu trả lời –

10

Tôi thích ví dụ tìm thấy here:

HighLevelException: MidLevelException: LowLevelException 
     at Junk.a(Junk.java:13) 
     at Junk.main(Junk.java:4) 
Caused by: MidLevelException: LowLevelException 
     at Junk.c(Junk.java:23) 
     at Junk.b(Junk.java:17) 
     at Junk.a(Junk.java:11) 
     ... 1 more 
Caused by: LowLevelException 
     at Junk.e(Junk.java:30) 
     at Junk.d(Junk.java:27) 
     at Junk.c(Junk.java:21) 
     ... 3 more 

Về cơ bản trong mã nguồn, main gọi function a trong đó kêu gọi function b trong đó kêu gọi ... trong đó kêu gọi function e. Function e ném một LowLevelException gây chức năng c để bắt LowLevelException và ném một MidLevelException (gói các dụ LowLevelException bên trong MidLevelException dụ. Lớp Exception có một constructor đó là có khả năng chụp trong một ngoại lệ khác nhau, gói nó). Điều này làm cho chức năng a bắt được số MidLevelException và ném một số HighLevelException hiện kết thúc tốt đẹp hai phiên bản trước đó Exception.

Như đã lưu ý trong các câu trả lời khác, dấu vết ngăn xếp không thực sự bị cắt ngắn, bạn sẽ thấy dấu vết ngăn xếp đầy đủ. Các .. .3 more trong ví dụ của tôi là có bởi vì nó sẽ được dự phòng khác. Nếu bạn muốn trở thành dòng sản lượng dư thừa và chất thải, .. 3 more có thể được thay thế bằng

at Junk.b(Junk.java:17) 
at Junk.a(Junk.java:11) 
at Junk.main(Junk.java:4) 

Nhưng không có nhu cầu đầu ra ba dòng, vì họ đã được ngụ ý.

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