Android Studio IDE: ทำลายข้อยกเว้น


142

ดูเหมือนว่า Android Studio ของฉันไม่ต้องการหยุดพักด้วยข้อยกเว้นใด ๆ ตามค่าเริ่มต้น การเปิดใช้งานตัวแบ่ง "ข้อยกเว้นใด ๆ " จะเริ่มทำลายภายในไลบรารี JDE จริง มีวิธีใดที่จะบังคับให้แตกเฉพาะในข้อยกเว้นภายในรหัสของฉันเท่านั้น

มาจากจักรวาล Visual Studio กำลังมองหาพฤติกรรมการดีบัก VS เริ่มต้นที่นี่

คำตอบ:


212

หากต้องการทำลายข้อยกเว้นทั้งหมดถูกจับหรือไม่ถูกจับ:

  1. เปิดหน้าต่างจุดพักผ่านRun -> ดูจุดพัก
  2. กล่องโต้ตอบเบรกพอยต์จะปรากฏขึ้น ในบานหน้าต่างด้านซ้ายเลื่อนลงไปด้านล่าง เลือกข้อยกเว้นใด ๆภายใต้Java Exception Breakpoints
  3. ด้วยการเลือกข้อยกเว้นใด ๆในบานหน้าต่างด้านขวาให้กำหนดค่าดังนี้:
    • ระงับ: ทำเครื่องหมายแล้ว
    • ทั้งหมด: เลือก
    • เงื่อนไข: !(this instanceof java.lang.ClassNotFoundException)
    • การแจ้งเตือน: ทั้งสองจับข้อยกเว้นและข้อยกเว้น Uncaughtเลือก

ไดอะล็อกเบรกพอยต์

  1. กำหนดตัวกรองที่ระบุเนมสเปซของไลบรารีที่ดีบักเกอร์ควรทำลาย: เลือกช่องทำเครื่องหมายตัวกรองคลาสเพื่อเปิดใช้งานการกรองคลาส ( ตามที่กล่าวไว้โดย @Scott Barta ) จากนั้นคลิกปุ่ม... (elipsis) เพื่อเปิดกล่องโต้ตอบตัวกรองคลาส ระบุรูปแบบเนมสเปซคลาสโดยคลิกที่ปุ่มเพิ่มรูปแบบ(เพิ่มรูปแบบ) ป้อน:
    • com.myapp.* (แทนที่ด้วยคำนำหน้าเนมสเปซของแอปของคุณ)
    • java.* (หมายเหตุ: ตามคำถามของ OP ปล่อยให้สิ่งนี้ไม่ทำลายบนไลบรารี Java)
    • android.* (ตามด้านบนอย่าเพิ่งแก้ไขข้อบกพร่องรหัสแอปของตัวเอง)
    • เพิ่มเนมสเปซเพิ่มเติมตามความจำเป็น (เช่นไลบรารีของบุคคลที่สาม)

ตัวกรองคลาส

  1. กดตกลงจากนั้นปิดกล่องโต้ตอบเบรกพอยต์

6
@AndroidDev ไม่ใช่อินเทอร์เฟซที่ดีที่สุดโดยเฉพาะอย่างยิ่งเมื่อมาจากการใช้ Visual Studio IDE ตัวกรองคลาสมีไว้เพื่อป้องกันข้อผิดพลาดระดับต่ำทุกประเภทจากการหยุดแอปพลิเคชันบ่อยขึ้นมาก (โดยเฉพาะในระหว่างการเริ่มต้นแอป) ดังตัวอย่างให้ทำตามขั้นตอนด้านบน แต่ไม่มีตัวกรองคลาสจากนั้นเริ่มแอปในโหมดดีบักและดูว่าเกิดอะไรขึ้น
CJBS

6
@AndroidDev: ฉันคิดว่ามันสมเหตุสมผลจริงๆ โดยค่าเริ่มต้นจะทำลายข้อยกเว้นทั้งหมด คุณไม่ต้องกำหนดเงื่อนไขและตัวกรอง อย่างไรก็ตาม OP ได้ขอเฉพาะสำหรับการกรองข้อยกเว้น (ข้อยกเว้นในรหัสของเขาเอง)
Mooing Duck

5
ในฐานะผู้พัฒนา xcode / iOS และ android-n00b ฉันไม่รู้ว่าเพื่อให้เบรกพอยต์ใด ๆ เริ่มทำงานในสตูดิโอ Android คุณไม่สามารถคลิกไอคอน (สามเหลี่ยม) แบบเล่นเพื่อเริ่มแอปได้ คุณต้องเริ่มแอพโดยคลิกที่ไอคอนคล้ายบั๊กที่อยู่ด้านขวา
xaphod

@xaphod อีกวิธีหนึ่งคือเรียกใช้ในโหมดรีลีส (กดปุ่มเล่น) จากนั้นเมื่อแอปเริ่มทำงานแล้วให้แนบดีบักเกอร์ (โดยการกดอุปกรณ์ที่มีจุดบกพร่อง - สี่เหลี่ยมผืนผ้าแนวตั้งที่มีจุดบกพร่องสีเขียวที่ด้านขวาล่างของไอคอน) จากนั้นเลือก กระบวนการที่จะแก้ไขข้อบกพร่อง จะเร็วกว่ามากหากไม่ได้แก้ไขข้อบกพร่องของรหัสเริ่มต้นแอปใด ๆ ดู: developer.android.com/tools/debugging/…
CJBS

หากคุณใช้จูนิท (การดีบักขณะทดสอบหน่วย) คุณอาจต้องการเพิ่มตัวกรองคลาสorg.junit.*
Thomas Vincent

34

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


4
สำหรับใครที่กำลังมองหาหน้าต่าง Breakpoints สามารถดูได้ที่เมนู Run -> View Breakpoints
Patrick

2
ฉันกำลังลองสิ่งนี้ แต่ไม่สามารถใช้งานได้ ตัวกรองคลาสควรเป็นอย่างไร สามารถยกตัวอย่างได้หรือไม่?
Bart Friederichs

1
ฉันอยู่ในเรือลำเดียวกัน - ตัวกรองชั้นเรียนดูเหมือนจะไม่ได้ผลสำหรับฉัน ฉันได้ลอง com.mycompany แล้ว * แต่ไม่มีข้อยกเว้นใดที่ทำให้มันพัง
Kylotan

เพียงแค่หยุดใน ZygoteInit.java ทุกครั้ง! สวยไร้ประโยชน์! จะเอาชนะได้อย่างไร ???
Renaud Cerrato

Run-> View Breakpoints .... ใช่เราไม่ต้องการให้หน้าต่างแสดงภายใต้เมนู "View" เราจะ!
LarryBud

7

หากต้องการทำลายข้อยกเว้นทั้งหมดในโค้ดของคุณและข้อยกเว้นอื่น ๆ หากไม่พบ:

วิธีนี้จะกรองประเภทข้อยกเว้นที่รันไทม์พ่นออกมาในระหว่างการทำงานปกติ (ไม่พิเศษมากใช่ไหม) ไม่ได้ใช้ตัวกรองคลาสเนื่องจากจะกรองมากเกินไป จุดบกพร่องในโค้ดของคุณมักทำให้คลาสรันไทม์มีข้อยกเว้น (เช่นการเข้าถึงรายการอาร์เรย์หลังจากสิ้นสุด)

  1. เปิดใช้งานJava Exception BreakPoints / ข้อยกเว้นใด ๆสำหรับข้อยกเว้นที่ไม่ถูกจับเท่านั้น

  2. เพิ่มJava Exception BreakPoint ใหม่สำหรับException (java.lang)คลาสสำหรับข้อยกเว้นที่จับได้และไม่ถูกจับ เปิดใช้งานเงื่อนไขและตั้งค่าเป็นสิ่งนี้:

        !(this instanceof java.lang.ClassNotFoundException || this instanceof android.system.ErrnoException || this instanceof java.io.FileNotFoundException || this instanceof javax.net.ssl.SSLHandshakeException || this instanceof javax.net.ssl.SSLPeerUnverifiedException || this instanceof android.system.GaiException || this instanceof java.net.SocketTimeoutException || this instanceof java.net.SocketException || this instanceof java.security.NoSuchAlgorithmException)
    

เพิ่มในรายการการยกเว้นในเงื่อนไขข้อยกเว้นอื่น ๆ ที่คุณพบ (BTW การใช้java.lang.Exceptionเป็นวิธีรับรายการ "ข้อยกเว้นใด ๆ " ที่สองอย่างมีประสิทธิภาพ)


ไม่ดีกว่าที่จะใช้! (a || b || c) แทน! (a) &&! (b) &&! (c)
ceph3us
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.