มีวิธีในการThrowable.printStackTrace(PrintStream s)
พิมพ์การติดตามสแต็กแบบเต็มเพื่อที่ฉันจะเห็นเกินบรรทัดสุดท้ายของ"... 40 more"
หรือไม่
มีวิธีในการThrowable.printStackTrace(PrintStream s)
พิมพ์การติดตามสแต็กแบบเต็มเพื่อที่ฉันจะเห็นเกินบรรทัดสุดท้ายของ"... 40 more"
หรือไม่
คำตอบ:
คุณไม่จำเป็นต้อง; ข้อมูลนั้นอยู่ที่อื่นในการติดตามสแต็ก จากเอกสารของprintStackTrace()
:
หมายเหตุ:
"..."
การปรากฏตัวของบรรทัดที่มีตัวละคร บรรทัดเหล่านี้ระบุว่าส่วนที่เหลือของการติดตามสแต็กสำหรับข้อยกเว้นนี้ตรงกับจำนวนเฟรมที่ระบุจากด้านล่างของการติดตามสแต็กของข้อยกเว้นที่เกิดจากข้อยกเว้นนี้ (ข้อยกเว้น "ปิดล้อม")การจดชวเลขนี้สามารถลดความยาวของเอาต์พุตได้อย่างมากในกรณีทั่วไปที่มีการโยนข้อยกเว้นที่ห่อออกจากวิธีการเดียวกับที่จับ "ข้อยกเว้นเชิงสาเหตุ" ได้
กล่าวอีกนัยหนึ่ง"... x more"
จะปรากฏเฉพาะในข้อยกเว้นที่ถูกล่ามโซ่และเฉพาะเมื่อx
บรรทัดสุดท้ายของการติดตามสแต็กปรากฏอยู่แล้วซึ่งเป็นส่วนหนึ่งของการติดตามสแต็กของข้อยกเว้นที่ถูกล่ามโซ่อื่น
สมมติว่าเมธอดจับข้อยกเว้น Foo ห่อไว้ในข้อยกเว้น Bar และโยน Bar จากนั้นการติดตามสแต็กของ Foo จะสั้นลง หากคุณต้องการการติดตามแบบเต็มด้วยเหตุผลบางประการสิ่งที่คุณต้องทำคือใช้บรรทัดสุดท้ายก่อนการ...
ติดตามสแต็กใน Foo และค้นหาในการติดตามสแต็กของ Bar ทุกอย่างที่อยู่ใต้บรรทัดนั้นคือสิ่งที่จะพิมพ์ในการติดตามสแต็กของ Foo
เดาอย่างรวดเร็วด้วยวิธีการสำหรับคุณ
static void printLongerTrace(Throwable t){
for(StackTraceElement e: t.getStackTrace())
System.out.println(e);
}
ลองใช้การติดตามสแต็กจากเอกสารของ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
สาเหตุจะแสดงจากสาเหตุที่ซ้อนกันมากที่สุดที่ด้านล่าง ("สาเหตุหลัก") ไปยังสาเหตุที่มีการติดตามสแต็กที่พิมพ์ออกมา
ในกรณีนี้สาเหตุคือLowLevelException
ซึ่งเกิดจากการที่ก่อให้เกิดMidLevelException
HighLevelException
ในการรับการติดตามสแต็กที่สมบูรณ์คุณต้องดูที่เฟรมของข้อยกเว้นที่ปิดล้อม (และข้อยกเว้นการปิดล้อม):
ดังนั้นหากเราต้องการได้รับการติดตามสแต็กที่สมบูรณ์LowLevelException
เราจะทำสิ่งต่อไปนี้:
MidLevelException
)
MidLevelException
( HighLevelException
)การติดตามสแต็กที่สมบูรณ์ของคุณจะมีลักษณะดังนี้:
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)
หมายเหตุด้านข้าง:
อาจมีบางกรณีที่ไม่มีรายการเฟรมเช่น:
HighLevelException: MidLevelException
at Junk.main(Junk.java:4)
Caused by: MidLevelException
... 1 more
new HighLevelException(new MidLevelException())
นี้สามารถเกิดขึ้นได้เมื่อสาเหตุมันสร้างขึ้นในบรรทัดเดียวกัน: อย่าสับสนกับสิ่งนี้วิธีการที่อธิบายไว้ข้างต้นยังคงใช้งานได้ไม่มีเพียงเฟรมที่จะใช้จากข้อยกเว้นดำเนินการต่อด้วยการปิดล้อม
ในบางกรณีคุณสามารถช่วยตัวเองในการนับได้โดยดูที่เฟรมแรกซึ่งไม่ได้ถูกละไว้ (บรรทัดด้านบน... X more
) หากคุณทราบว่าเมธอดใดเรียกใช้เมธอดในบรรทัดนั้นคุณสามารถค้นหาผู้โทรได้โดยตรงในเฟรมของข้อยกเว้นที่ปิดล้อม:
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
...
คือเฟรมแรกที่แตกต่างกัน อย่างไรก็ตามอย่างน้อยก็จะอยู่ในคลาสเดียวกันซึ่งช่วยในการค้นหา