บางครั้งฉันเห็น
try {
} catch(Throwable e) {
}
และบางเวลา
try {
} catch(Exception e) {
}
อะไรคือความแตกต่าง?
บางครั้งฉันเห็น
try {
} catch(Throwable e) {
}
และบางเวลา
try {
} catch(Exception e) {
}
อะไรคือความแตกต่าง?
คำตอบ:
โดยการจับมันรวมถึงสิ่งที่ประเภทรองThrowable
Error
โดยทั่วไปคุณไม่ควรทำเช่นนั้นยกเว้นในระดับสูงสุด "ระดับทั้งหมด" ของเธรดที่คุณต้องการบันทึกหรือจัดการทุกอย่างที่ผิดพลาด มันจะเป็นเรื่องปกติมากขึ้นในแอ็พพลิเคชันชนิดของเฟรมเวิร์ก (ตัวอย่างเช่นแอ็พพลิเคชันเซิร์ฟเวอร์หรือเฟรมเวิร์กทดสอบ) ซึ่งสามารถรันโค้ดที่ไม่รู้จักและไม่ควรได้รับผลกระทบจากสิ่งใดก็ตามที่ผิดพลาดกับรหัสนั้น
throw new Throwable();
ดังนั้นจึงเป็นวิธีเดียวที่จะจับทุกอย่างได้อย่างแท้จริง
คนแรกที่จับ subclasses ทั้งหมดThrowable
(รวมถึงException
และError
), คนที่สองจับ subclasses Exception
ทั้งหมดของ
Error
เป็นโปรแกรมที่ไม่สามารถกู้คืนได้ในทางใดทางหนึ่งและมักจะไม่ถูกดักจับยกเว้นเพื่อจุดประสงค์ในการบันทึก (ซึ่งส่งผ่านอีกครั้ง) Exception
สามารถกู้คืนโดยทางโปรแกรม คลาสย่อยมันRuntimeException
ระบุข้อผิดพลาดในการเขียนโปรแกรมและมักจะไม่ถูกจับเช่นกัน
Error
และ 2) เว้นแต่จะมีการบันทึกคุณอาจไม่เคยได้รับแจ้งว่ามี OOM เกิดขึ้นทำให้คุณสงสัยว่าทำไมเซิร์ฟเวอร์เริ่มทำงาน "ตลก"
programmatically unrecoverable
หมายความว่า? มันรุนแรงเหลือเกินที่เราไม่สามารถเรียกวิธีการใด ๆ ของ Java หลังจากที่จับมันอีกต่อไปแล้ว (การบันทึกเป็นต้น) โดยไม่มีโอกาสได้รับพฤติกรรมที่ไม่สามารถคาดเดาได้จาก JVM
Its subclass RuntimeException indicates a programming error
: ไม่แน่ใจว่าฉันเห็นด้วยกับข้อความนี้หรือไม่ หากเป็นจริงก็หมายความว่าควรมีการตรวจสอบข้อยกเว้นที่คาดไว้ทั้งหมด ถ้าฉันคาดหวังว่าบางสิ่งอาจล้มเหลวและไม่สามารถกู้คืนได้โดยแอปพลิเคชันของฉัน แต่อย่างน้อยฉันก็ต้องการให้มีข้อยกเว้นที่มีความหมาย? การใช้ข้อยกเว้นที่ตรวจสอบในกรณีนั้นดูเหมือนว่าไร้ประโยชน์และสร้างรหัสสำเร็จรูป
Thowable
จับทุกอย่างแม้กระทั่ง ThreadDeath ซึ่งจะถูกโยนโดยค่าเริ่มต้นเพื่อหยุดเธรดจากThread.stop()
วิธีที่เลิกใช้แล้ว ดังนั้นโดยการจับThrowable
คุณสามารถมั่นใจได้ว่าคุณจะไม่ปล่อยให้บล็อกลองโดยไม่ต้องอย่างน้อยจะผ่านการตรวจจับบล็อกของคุณ แต่คุณควรเตรียมที่จะยังจัดการOutOfMemoryError
และหรือInternalError
StackOverflowError
การจับThrowable
เป็นประโยชน์มากที่สุดสำหรับเซิร์ฟเวอร์ภายนอกลูปที่มอบหมายการร้องขอทุกประเภทให้กับรหัสภายนอก แต่ตัวเองอาจไม่เคยยุติเพื่อให้บริการมีชีวิตอยู่
Throwable
เป็นชั้นสุดของเช่นเดียวกับException
Error
ในกรณีปกติเราควรจับคลาสย่อยเสมอException
เพื่อไม่ให้รากสาเหตุหายไป
กรณีพิเศษเฉพาะที่คุณเห็นเป็นไปได้ของสิ่งที่ผิดไปซึ่งไม่ได้อยู่ในการควบคุมของรหัส Java ของคุณคุณควรจับหรือError
Throwable
ฉันจำได้ว่าจับได้ Throwable เพื่อตั้งค่าสถานะว่าไลบรารีดั้งเดิมไม่ได้โหลด
ฉันเคยเห็นคนใช้ Throwable เพื่อตรวจจับข้อผิดพลาดบางอย่างที่อาจเกิดขึ้นเนื่องจากความล้มเหลวของอินฟา / ไม่พร้อมใช้งาน