Làm cách nào để tăng số dòng được hiển thị của một kết xuất theo dõi ngăn xếp Java?


Câu trả lời:


122

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 xdò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.


Đoạn cuối gây hiểu lầm. Sẽ không có bất kỳ sự chồng chéo nào, dòng trước ...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ó.
Marcono1234

5

Đoán nhanh một phương pháp cho bạn.

static void printLongerTrace(Throwable t){
    for(StackTraceElement e: t.getStackTrace())
        System.out.println(e);
}

2

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 LowLevelExceptionnào gây MidLevelExceptionra 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):

  1. Xem có bao nhiêu khung hình đã bị bỏ qua: "... X nữa"
  2. Tìm các khung bị bỏ qua ở ngoại lệ kèm theo
    1. Xem có bao nhiêu khung hình bị bỏ qua: "... Y more"
    2. Nối các khung X - Y đầu tiên vào dấu vết ngăn xếp
  3. Nếu Y> 0, hãy lặp lại bước 2 với nó là số khung hình bị bỏ qua

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, LowLevelExceptionchúng tôi sẽ làm như sau:

  1. Xem có bao nhiêu khung hình bị bỏ qua: "... 3 khung nữa"
  2. Tìm các khung bị bỏ qua tại ngoại lệ đi kèm ( MidLevelException)
    1. 1 khung đã được bỏ qua ( "... 1 nhiều hơn")
    2. Nối 2 (3 - 1) khung đầu tiên vào dấu vết ngăn xếp
  3. Lặp lại bước 2 với 1 là số khung hình bị bỏ qua
    1. Nhìn vào ngoại lệ bao gồm MidLevelException( HighLevelException)
    2. Nối 1 khung đầu tiên vào dấu vết ngăn xếp

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.