มี "ข้อผิดพลาดในการยกเว้น" ใน IntelliJ หรือไม่


318

มีคุณสมบัติที่จะแบ่งการดีบักโดยอัตโนมัติเมื่อเกิดข้อยกเว้นครั้งแรกหรือไม่

ดังนั้นเรา

  1. เริ่มแอปพลิเคชัน
  2. ทำสิ่งที่ผิดปกติ
  3. มี IntelliJ โผล่ขึ้นมาในบรรทัดที่ไฮไลต์ที่เกิดข้อยกเว้น

คุณอาจต้องการทำลายข้อยกเว้นที่ไม่ได้ตรวจสอบเท่านั้นใช่ไหม
David Ferenczy Rogožan

คำตอบ:


367

เรียกใช้ | ดูเบรกพอยต์ จุดพักข้อยกเว้น


น่าเสียดายที่ฉันพบว่าในทางปฏิบัติ (ด้วยข้อมูลขนาดใหญ่) ตัวแปรเฟรมที่คุณสนใจไม่ได้โหลดเสมอ
information_interchange

158

วิธีที่รวดเร็วในการเปิดกล่องโต้ตอบคือกดCtrl+ SHIFT+ F8(บน Mac: Cmd+ SHIFT+ F8) จากนั้นคลิกที่แท็บจุดพักข้อยกเว้น หากนั่นคือแท็บสุดท้ายที่คุณกำลังดูมันจะยังคงถูกเลือกอยู่ทำให้ง่ายต่อการสะบัดแบ่งข้อยกเว้นเปิดและปิด

สิ่งนี้จะทำให้ IntelliJ แตกที่จุดในรหัส (หรือรหัสห้องสมุด) ที่มีการยกข้อยกเว้น โดยเฉพาะคุณจะได้รับ 'โอกาสครั้งแรก' ที่การจัดการข้อยกเว้นก่อนที่สแต็กจะเดินหา catch / ในที่สุดบล็อกที่จะดำเนินการ


เคล็ดลับ: Java มีแนวโน้มที่จะโยนข้อยกเว้นจำนวนมากภายในเมื่อโหลดคลาสดังนั้นการทำลายข้อยกเว้นทั้งหมดนี้อาจกลายเป็นเรื่องน่าเบื่อ ข่าวดีก็คือคุณสามารถยกเว้นข้อยกเว้นบางประเภทได้โดยใช้ฟิลด์เงื่อนไข

ตัวอย่างเช่น:

!(this instanceof java.lang.ClassNotFoundException)

คุณสามารถเชื่อมโยงเงื่อนไขหลายอย่างเข้าด้วยกัน&&ได้

ป้อนคำอธิบายรูปภาพที่นี่


9
มีวิธีที่จะบอก "หยุดข้อยกเว้นจากโครงการของฉันเท่านั้น (ไม่ใช่จากระบบ Java)" หรือไม่
ผักแช่ง

16
อย่าลืม "ปิดการใช้งานจนกว่าจะถึงจุดพักที่เลือก:" - อันนี้น่าทึ่ง เพียงตั้งค่าเบรกพอยต์ในรหัสของคุณหลังจากโหลด Java และไลบรารีอื่น ๆ ทั้งหมดแล้ว จากนั้นเลือกเบรกพอยต์ของคุณจากดรอปดาวน์แล้วรอ เบรกพอยต์ของคุณจะถูกตีและจากนั้นเมื่อคุณกดดำเนินการต่อใหม่ติดและ Uncaught กรองข้อยกเว้นของคุณจะเตะใน :).
หลุยส์ St-Amour

1
อย่าลืมตรวจสอบทั้ง "ข้อยกเว้นที่ถูกจับ" และ "ข้อยกเว้นที่ไม่ถูกตรวจจับ" ที่ด้านล่างของกล่องโต้ตอบ
Robino

59

ในIntelliJ IDEA 14ไปที่:

Run -> View Breakpoints -> Check "Java Exceptions Breakpoints" -> Uncheck "Caught Exceptions"

หากคุณไม่ยกเลิกCaught Exceptionsการเลือกการดำเนินการจะถูกหยุดทุกครั้งที่มีการJava Frameworkโยนข้อยกเว้นภายใน


1
เรียกใช้ -> ดูจุดพัก ... -> ทำเครื่องหมายที่ "จุดพักข้อยกเว้น Java" -> ยกเลิกการเลือก "ข้อยกเว้นที่จับได้"
Jonas

2
น่าเสียดายที่ยังคงมีข้อยกเว้นที่ตรวจพบได้สำหรับฉันแม้หลังจากปิดใช้งาน "ข้อยกเว้นที่ตรวจพบ"
Carcigenicate

นี่เป็นข้อมูลสำคัญที่ฉันจะพูดมิฉะนั้นมันเป็นข้อยกเว้นที่ไม่มีค่าข้อมูล ส่วนใหญ่เมื่อใช้เฟรมเวิร์กขนาดใหญ่เช่น Grails
David Ferenczy Rogožan

ตกลงฉันเปลี่ยนใจ - ทั้งตัวเลือกที่มีและไม่มีข้อยกเว้นที่จับได้นั้นไม่ดีเพราะโดยปกติในเว็บแอปพลิเคชันทั่วไปข้อยกเว้นทั้งหมดที่ใช้ในการถูกจับมีบล็อก catch ระดับบนสุดที่จับทุกอย่างและจัดรูปแบบให้เป็น นำเสนอให้กับผู้ใช้ ดังนั้นหากไม่มีข้อยกเว้นที่จับได้มันจะไม่ผิดเพี้ยนอะไรกับมันมันจะแบ่งร้อยครั้งในระหว่างการร้องขอครั้งเดียว ทั้งสองไร้ประโยชน์ :(
David Ferenczy Rogožan

ไม่มีอะไรไร้ประโยชน์ถ้าคุณรู้วิธีใช้งาน
Alessandro Flati

12

ใช่แล้ว คุณต้องกำหนดจุดพักข้อยกเว้น (อาจเป็น "ข้อยกเว้นใด ๆ ") ในกล่องโต้ตอบจุดพักใน IntelliJ IDEA

ข้อยกเว้นสามารถกรองตามเงื่อนไขหรือคลาสหากต้องการหรือไม่ว่าคุณจะสนใจในข้อยกเว้นที่ตรวจพบหรือไม่ได้ตรวจสอบ


7

หากคุณคลิกที่เครื่องหมาย "+" เล็ก ๆ ที่มุมซ้ายบนคุณสามารถเพิ่มเบรกพอยต์ใหม่ได้ หากคุณเลือก Exception Breakpoint คุณจะได้รับกล่องโต้ตอบเล็ก ๆ ที่คุณสามารถเข้าสู่คลาสยกเว้นเพื่อไปต่อได้ (ในกรณีที่คุณไม่ต้องการเจาะข้อยกเว้นทั้งหมด)


0

ในรุ่นใหม่บน IntelliJ ในภายใต้Run > ดูจุดพัก

จากนั้นตรวจสอบJava จุดพักข้อยกเว้น -> ข้อยกเว้นใด

วิธีที่ดีในการแก้ปัญหาข้อยกเว้นคือการใช้แพคเกจ app .*หลักของคุณและบัตรเสริม วิธีนี้คุณจะข้ามข้อยกเว้นไลบรารีอื่น ๆ ทั้งหมดเนื่องจากส่วนใหญ่คุณกำลังมองหาข้อยกเว้นที่แอพของคุณโยนและไม่ได้มาจากไลบรารี่อื่น ๆ (ซึ่งอาจเป็นข้อยกเว้นจำนวนมาก)

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

PD คำตอบเพิ่มเพียงเพื่อชี้ให้เห็นประโยชน์สวยกรองชั้นจับ

จุดพัก

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