ฉันจะเพิ่มจำนวนบรรทัดที่แสดงของ Java stack trace dump ได้อย่างไร


คำตอบ:


123

คุณไม่จำเป็นต้อง; ข้อมูลนั้นอยู่ที่อื่นในการติดตามสแต็ก จากเอกสารของprintStackTrace():

หมายเหตุ: "..."การปรากฏตัวของบรรทัดที่มีตัวละคร บรรทัดเหล่านี้ระบุว่าส่วนที่เหลือของการติดตามสแต็กสำหรับข้อยกเว้นนี้ตรงกับจำนวนเฟรมที่ระบุจากด้านล่างของการติดตามสแต็กของข้อยกเว้นที่เกิดจากข้อยกเว้นนี้ (ข้อยกเว้น "ปิดล้อม")

การจดชวเลขนี้สามารถลดความยาวของเอาต์พุตได้อย่างมากในกรณีทั่วไปที่มีการโยนข้อยกเว้นที่ห่อออกจากวิธีการเดียวกับที่จับ "ข้อยกเว้นเชิงสาเหตุ" ได้

กล่าวอีกนัยหนึ่ง"... x more"จะปรากฏเฉพาะในข้อยกเว้นที่ถูกล่ามโซ่และเฉพาะเมื่อxบรรทัดสุดท้ายของการติดตามสแต็กปรากฏอยู่แล้วซึ่งเป็นส่วนหนึ่งของการติดตามสแต็กของข้อยกเว้นที่ถูกล่ามโซ่อื่น

สมมติว่าเมธอดจับข้อยกเว้น Foo ห่อไว้ในข้อยกเว้น Bar และโยน Bar จากนั้นการติดตามสแต็กของ Foo จะสั้นลง หากคุณต้องการการติดตามแบบเต็มด้วยเหตุผลบางประการสิ่งที่คุณต้องทำคือใช้บรรทัดสุดท้ายก่อนการ...ติดตามสแต็กใน Foo และค้นหาในการติดตามสแต็กของ Bar ทุกอย่างที่อยู่ใต้บรรทัดนั้นคือสิ่งที่จะพิมพ์ในการติดตามสแต็กของ Foo


ย่อหน้าสุดท้ายทำให้เข้าใจผิด จะไม่มีการทับซ้อนกันเส้นก่อน...คือเฟรมแรกที่แตกต่างกัน อย่างไรก็ตามอย่างน้อยก็จะอยู่ในคลาสเดียวกันซึ่งช่วยในการค้นหา
Marcono1234

5

เดาอย่างรวดเร็วด้วยวิธีการสำหรับคุณ

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

3

ลองใช้การติดตามสแต็กจากเอกสารของ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ซึ่งเกิดจากการที่ก่อให้เกิดMidLevelExceptionHighLevelException

ในการรับการติดตามสแต็กที่สมบูรณ์คุณต้องดูที่เฟรมของข้อยกเว้นที่ปิดล้อม (และข้อยกเว้นการปิดล้อม):

  1. ดูจำนวนเฟรมที่ละไว้: "... X more"
  2. มองหาเฟรมที่ละไว้ที่ข้อยกเว้นที่ปิดล้อม
    1. ดูจำนวนเฟรมที่ละไว้: "... Y more"
    2. ผนวกเฟรม X - Y แรกเข้ากับการติดตามสแต็ก
  3. ถ้า Y> 0 ให้ทำซ้ำขั้นตอนที่ 2 ตามจำนวนเฟรมที่ละไว้

ดังนั้นหากเราต้องการได้รับการติดตามสแต็กที่สมบูรณ์LowLevelExceptionเราจะทำสิ่งต่อไปนี้:

  1. ดูจำนวนเฟรมที่ละไว้: "... 3 more"
  2. มองหาเฟรมที่ละไว้ที่ข้อยกเว้นการปิดล้อม ( MidLevelException)
    1. ละเว้น 1 เฟรม ("... 1 more")
    2. ผนวกเฟรม 2 (3 - 1) แรกเข้ากับการติดตามสแต็ก
  3. ทำซ้ำขั้นตอนที่ 2 โดยให้ 1 เป็นจำนวนเฟรมที่ละไว้
    1. ดูที่การปิดล้อมข้อยกเว้นของMidLevelException( HighLevelException)
    2. ต่อท้าย 1 เฟรมแรกกับการติดตามสแต็ก

การติดตามสแต็กที่สมบูรณ์ของคุณจะมีลักษณะดังนี้:

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
    
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.