Apakah ada cara untuk membuat Throwable.printStackTrace(PrintStream s)jejak tumpukan penuh, sehingga saya bisa melihat melampaui baris terakhir "... 40 more"?
Apakah ada cara untuk membuat Throwable.printStackTrace(PrintStream s)jejak tumpukan penuh, sehingga saya bisa melihat melampaui baris terakhir "... 40 more"?
Jawaban:
Anda tidak perlu; informasi tersebut ada di tempat lain di pelacakan tumpukan. Dari dokumen printStackTrace():
Perhatikan keberadaan garis yang berisi karakter
"...". Baris ini menunjukkan bahwa sisa pelacakan tumpukan untuk pengecualian ini cocok dengan jumlah bingkai yang ditunjukkan dari bagian bawah jejak tumpukan pengecualian yang disebabkan oleh pengecualian ini (pengecualian "melampirkan").Singkatan ini dapat sangat mengurangi panjang keluaran dalam kasus umum di mana pengecualian terbungkus dilemparkan dari metode yang sama saat "pengecualian kausatif" ditangkap.
Dengan kata lain, "... x more"hanya muncul di pengecualian berantai, dan hanya jika xbaris terakhir dari jejak tumpukan sudah ada sebagai bagian dari jejak tumpukan pengecualian berantai lainnya.
Misalkan suatu metode menangkap pengecualian Foo, membungkusnya dalam Bilah pengecualian, dan melempar Bilah. Kemudian jejak tumpukan Foo akan dipersingkat. Jika Anda karena alasan tertentu menginginkan jejak lengkap, yang perlu Anda lakukan adalah mengambil baris terakhir sebelum ...jejak tumpukan di Foo dan mencarinya di jejak tumpukan Bar; segala sesuatu di bawah garis itu persis seperti yang akan dicetak dalam jejak tumpukan Foo.
Mari kita ambil jejak tumpukan dari dokumentasi 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
Penyebabnya ditampilkan dari yang paling bertingkat di bagian bawah ("akar masalah"), ke jejak tumpukan yang dicetak.
Dalam hal ini akar penyebabnya adalah LowLevelException, yang disebabkan MidLevelException, yang disebabkan HighLevelException.
Untuk mendapatkan pelacakan tumpukan lengkap Anda harus melihat bingkai dari pengecualian yang melampirkan (dan pengecualian yang melampirkan):
Jadi jika kami ingin mendapatkan jejak tumpukan lengkap LowLevelExceptionkami akan melakukan hal berikut:
MidLevelException)
MidLevelException(HighLevelException )Jejak tumpukan lengkap Anda akan terlihat seperti ini:
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)
Catatan samping:
Mungkin ada kasus di mana tidak ada bingkai yang terdaftar, misalnya:
HighLevelException: MidLevelException
at Junk.main(Junk.java:4)
Caused by: MidLevelException
... 1 more
Hal ini dapat terjadi jika penyebabnya itu dibuat di baris yang sama: new HighLevelException(new MidLevelException()). Jangan bingung dengan ini, pendekatan yang dijelaskan di atas masih berfungsi, hanya tidak ada bingkai untuk digunakan dari pengecualian, lanjutkan dengan yang melampirkan.
Dalam beberapa kasus, Anda dapat menghemat penghitungan dengan melihat bingkai pertama yang tidak dihilangkan (baris di atas ... X more). Jika Anda mengetahui metode mana yang memanggil metode di baris itu, Anda dapat langsung mencari pemanggil dalam bingkai pengecualian yang melampirkan:
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
...adalah bingkai pertama yang berbeda. Namun setidaknya akan berada di kelas yang sama yang membantu menemukannya.