Có cách nào để Throwable.printStackTrace(PrintStream s)
in dấu vết ngăn xếp đầy đủ, để tôi có thể nhìn thấy ngoài dòng cuối cùng của "... 40 more"
không?
Có cách nào để Throwable.printStackTrace(PrintStream s)
in dấu vết ngăn xếp đầy đủ, để tôi có thể nhìn thấy ngoài dòng cuối cùng của "... 40 more"
không?
Câu trả lời:
Bạn không cần phải; thông tin đó hiện diện ở nơi khác trong dấu vết ngăn xếp. Từ tài liệu của printStackTrace()
:
Lưu ý sự hiện diện của các dòng chứa các ký tự
"..."
. Các dòng này chỉ ra rằng phần còn lại của dấu vết ngăn xếp cho ngoại lệ này khớp với số khung được chỉ định từ cuối dấu vết ngăn xếp của ngoại lệ do ngoại lệ này gây ra (ngoại lệ "bao gồm").Cách viết tắt này có thể làm giảm đáng kể độ dài của đầu ra trong trường hợp phổ biến khi một ngoại lệ được bao bọc được ném ra từ cùng một phương thức như "ngoại lệ nguyên nhân" được bắt.
Nói cách khác, "... x more"
chỉ xuất hiện trên một ngoại lệ có chuỗi và chỉ khi các x
dòng cuối cùng của dấu vết ngăn xếp đã có mặt như một phần của dấu vết ngăn xếp của ngoại lệ có chuỗi khác.
Giả sử rằng một phương thức bắt Foo ngoại lệ, bao bọc nó trong Thanh ngoại lệ và ném Thanh. Sau đó, dấu vết ngăn xếp của Foo sẽ được rút ngắn. Nếu bạn vì lý do nào đó muốn có dấu vết đầy đủ, tất cả những gì bạn cần làm là lấy dòng cuối cùng trước ...
dấu vết ngăn xếp trong Foo và tìm kiếm nó trong dấu vết ngăn xếp của Bar; mọi thứ bên dưới dòng đó chính xác là những gì sẽ được in trong dấu vết ngăn xếp của Foo.
Hãy lấy dấu vết ngăn xếp từ tài liệu của Throwable.printStackTrace () :
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
Các nguyên nhân được hiển thị từ nguyên nhân lồng nhau nhất ở dưới cùng ("nguyên nhân gốc") đến nguyên nhân mà dấu vết ngăn xếp được in thuộc về.
Trong trường hợp này, nguyên nhân gốc rễ là do nguyên nhân LowLevelException
nào gây MidLevelException
ra HighLevelException
.
Để có được dấu vết ngăn xếp hoàn chỉnh, bạn phải xem các khung của ngoại lệ bao quanh (và các ngoại lệ đi kèm):
Vì vậy, nếu chúng tôi muốn có được dấu vết ngăn xếp hoàn chỉnh, LowLevelException
chúng tôi sẽ làm như sau:
MidLevelException
)
MidLevelException
( HighLevelException
)Dấu vết ngăn xếp hoàn chỉnh của bạn sau đó trông giống như sau:
LowLevelException
at Junk.e(Junk.java:30)
at Junk.d(Junk.java:27)
at Junk.c(Junk.java:21)
// From MidLevelException stack trace
at Junk.b(Junk.java:17)
at Junk.a(Junk.java:11)
// From HighLevelException stack trace
at Junk.main(Junk.java:4)
Ghi chú bên lề:
Có thể có những trường hợp không có khung nào được liệt kê, ví dụ:
HighLevelException: MidLevelException
at Junk.main(Junk.java:4)
Caused by: MidLevelException
... 1 more
Điều này có thể xảy ra khi nguyên nhân gây ra nó được tạo ra trong cùng một dòng: new HighLevelException(new MidLevelException())
. Đừng bối rối vì điều này, cách tiếp cận được mô tả ở trên vẫn hoạt động, chỉ là không có khung nào để sử dụng từ ngoại lệ, hãy tiếp tục với một khung bao quanh.
Trong một số trường hợp, bạn có thể tiết kiệm cho mình việc đếm bằng cách nhìn vào khung đầu tiên không bị bỏ qua (dòng trên ... X more
). Nếu bạn biết phương thức nào gọi phương thức trong dòng đó, bạn có thể trực tiếp tìm kiếm trình gọi trong khung của ngoại lệ kèm theo:
HighLevelException: MidLevelException: LowLevelException
at Junk.c(Junk.java:29)
at Junk.b(Junk.java:21)
at Junk.a(Junk.java:13)
at Junk.main(Junk.java:4)
Caused by: MidLevelException
// You know Junk.d is only called by Junk.b
at Junk.d(Junk.java:35)
... 3 more
...
là khung đầu tiên có sự khác biệt. Tuy nhiên, ít nhất nó sẽ nằm trong cùng một lớp giúp tìm ra nó.