มีกฎบางประการสำหรับการจัดการข้อยกเว้นที่คุณควรคำนึงถึง แต่ก่อนอื่นคุณต้องจำไว้ว่าข้อยกเว้นเป็นส่วนหนึ่งของส่วนต่อประสานที่ถูกเปิดเผยโดยโค้ด เอกสารพวกเขา สิ่งนี้มีความสำคัญเป็นพิเศษเมื่ออินเทอร์เฟซเป็นแบบสาธารณะแน่นอน แต่เป็นความคิดที่ดีมากในอินเทอร์เฟซส่วนตัวเช่นกัน
ควรมีการจัดการข้อยกเว้น ณ จุดที่รหัสสามารถทำสิ่งที่เหมาะสมกับพวกเขา ตัวเลือกการจัดการที่เลวร้ายที่สุดคือไม่ต้องทำอะไรเลยเกี่ยวกับพวกเขาซึ่งควรทำเมื่อเป็นตัวเลือกที่ถูกต้องเท่านั้น (เมื่อฉันมีสถานการณ์เช่นนี้ในรหัสของฉันฉันรวมความคิดเห็นกับเอฟเฟกต์นั้นเพื่อที่ฉันจะได้ไม่ต้องกังวลกับร่างกายที่ว่างเปล่า)
ตัวเลือกที่เลวร้ายที่สุดที่สองคือการโยนข้อยกเว้นที่ไม่เกี่ยวข้องโดยไม่ต้องแนบต้นฉบับเป็นสาเหตุ ปัญหาที่นี่คือข้อมูลภายในข้อยกเว้นเดิมที่จะช่วยให้การวินิจฉัยปัญหาหายไป คุณกำลังสร้างบางสิ่งที่ไม่มีใครสามารถทำอะไรได้เลย (นอกเหนือจากบ่นว่า "มันไม่ทำงาน" และเราทุกคนรู้ว่าเราเกลียดรายงานข้อผิดพลาดเหล่านั้น )
ดีกว่ามากคือการบันทึกข้อยกเว้น ซึ่งช่วยให้ใครบางคนค้นหาว่าปัญหาคืออะไรและแก้ไขได้ แต่คุณควรบันทึกข้อยกเว้น ณ จุดที่จะหายไปหรือรายงานผ่านการเชื่อมต่อภายนอก นั่นไม่ใช่เพราะการบันทึกบ่อยครั้งเป็นปัญหาสำคัญเช่นนี้ แต่เนื่องจากการบันทึกที่มากเกินไปหมายความว่าคุณเพิ่งได้รับเนื้อที่ใช้งานมากขึ้นโดยไม่ต้องมีข้อมูลมากขึ้น เมื่อคุณได้เข้าสู่ระบบยกเว้นคุณสามารถรายงานย่อให้กับผู้ใช้ / ลูกค้าที่มีจิตสำนึกที่ดี (ตราบใดที่คุณยังรวมถึงเวลาของคนรุ่น - หรือระบุความสัมพันธ์อื่น ๆ - ในรายงานว่าเพื่อให้รุ่นสั้นสามารถจับคู่ ขึ้นกับรายละเอียดหากจำเป็น)
ตัวเลือกที่ดีที่สุดคือการจัดการข้อยกเว้นอย่างสมบูรณ์จัดการกับสถานการณ์ข้อผิดพลาดอย่างครบถ้วน หากคุณสามารถทำได้โดยทั้งหมดทำมัน! อาจหมายความว่าคุณสามารถหลีกเลี่ยงการบันทึกข้อยกเว้น
วิธีหนึ่งในการจัดการข้อยกเว้นคือการโยนข้อยกเว้นอื่นที่ให้คำอธิบายปัญหาในระดับที่สูงขึ้น (เช่น“ failed to initialize
” แทนที่จะเป็น“ index out of bounds
”) นี่เป็นรูปแบบที่ดีตราบใดที่คุณไม่สูญเสียข้อมูลเกี่ยวกับสาเหตุของข้อยกเว้น ใช้ข้อยกเว้นโดยละเอียดเพื่อเริ่มต้นcause
ข้อยกเว้นระดับสูงกว่าหรือบันทึกรายละเอียด (ดังที่อธิบายไว้ข้างต้น) การบันทึกมีความเหมาะสมที่สุดเมื่อคุณกำลังจะข้ามขอบเขตระหว่างกระบวนการเช่นการโทร IPC เนื่องจากไม่มีการรับประกันว่าจะมีคลาสข้อยกเว้นระดับต่ำในปลายอีกด้านหนึ่งของการเชื่อมต่อ การรักษาเป็นสาเหตุที่แนบมาเหมาะสมที่สุดเมื่อข้ามขอบเขตภายใน
อีกรูปแบบที่คุณเห็นคือแบบ catch-and-release:
try {
// ...
} catch (FooException e) {
throw e;
}
นี่เป็นรูปแบบการต่อต้านเว้นแต่คุณจะมีข้อ จำกัด ประเภทจากส่วนcatch
คำสั่งอื่น ๆซึ่งหมายความว่าคุณไม่สามารถปล่อยให้ข้อยกเว้นผ่านไปได้ด้วยตัวเอง จากนั้นเป็นเพียงคุณสมบัติที่น่าเกลียดของ Java
ไม่มีความแตกต่างที่แท้จริงระหว่างข้อยกเว้นที่ตรวจสอบและไม่ได้ตรวจสอบอย่างอื่นนอกเหนือจากความจริงที่ว่าคุณต้องประกาศข้อยกเว้นที่ตรวจสอบแล้วซึ่งมีขอบเขตข้ามวิธีการ ยังคงเป็นความคิดที่ดีที่จะบันทึกข้อยกเว้นที่ไม่ได้ตรวจสอบ (ด้วย@throws
ความคิดเห็น javadoc) หากคุณรู้ว่ารหัสเหล่านั้นถูกโยนโดยเจตนา อย่าจงใจโยนjava.lang.Error
หรือคลาสย่อยของมัน (เว้นแต่ว่าคุณกำลังเขียนการใช้งาน JVM)
ความคิดเห็น:กรณีข้อผิดพลาดที่ไม่คาดคิดแสดงถึงบั๊กในรหัสของคุณเสมอ การตรวจสอบข้อยกเว้นเป็นวิธีการจัดการภัยคุกคามนี้และที่นักพัฒนาจงใจใช้ข้อยกเว้นที่ไม่ได้ตรวจสอบเพื่อหลีกเลี่ยงปัญหาในการจัดการกรณีข้อผิดพลาดคุณกำลังสร้างหนี้ทางเทคนิคจำนวนมากที่คุณต้องทำความสะอาดในบางครั้ง ถ้าคุณต้องการรหัสที่แข็งแกร่ง การจัดการข้อผิดพลาดที่เลอะเทอะไม่เป็นมืออาชีพ (และการดูที่การจัดการข้อผิดพลาดเป็นวิธีที่ดีในการพิจารณาว่าโปรแกรมเมอร์ดีแค่ไหน)