ข้อยกเว้นควรเป็นเพียงแค่นั้น .. ข้อยกเว้น แนวทางปฏิบัติที่ดีที่สุดเมื่อใช้ข้อยกเว้นคือให้ใช้เพื่อครอบคลุมสถานการณ์ที่มีสิ่งที่ตรงกันข้ามกับสิ่งที่คุณคาดหวังว่าจะเกิดขึ้น ตัวอย่างคลาสสิกคือ FileNotFoundException ซึ่งถูกส่งออกไปเมื่อไม่มีไฟล์อยู่ที่นั่น หากคุณกำลังทดสอบการมีอยู่ของไฟล์คุณควรใช้ File.exists () เนื่องจากคุณเพียงแค่ใช้ไม้เท้า 10 ฟุตเพื่อดูว่าคุณมีอะไรกระทบหรือไม่
ในทางเทคนิคคุณสามารถบรรลุผลลัพธ์เดียวกันโดยการลองจับและใช้ไฟล์ราวกับว่ามันมีอยู่จริง แต่ A) ข้อยกเว้นโดยทั่วไปเป็นทรัพยากรที่มีราคาแพงและนักเขียนโปรแกรม B) จะถือว่าคุณหมายถึงไฟล์นั้นถ้ามันเป็น ในลอง catch ซึ่งเพิ่มความสับสนโดยรวมของโปรแกรม
มีหลายสถานการณ์ที่ฉันจะเขียนวิธีที่ดึงค่าบางอย่างจากฐานข้อมูล สิ่งหนึ่งพันอาจผิดไปและเมื่อเห็นว่าฉันต้องการเพียงข้อมูลชิ้นเล็ก ๆ มันไม่สะดวกที่จะล้อมรอบการโทรด้วยรายการลองที่มี 5 ข้อยกเว้นต่าง ๆ ดังนั้นฉันจะจับข้อยกเว้นในวิธีการดึงข้อมูล หากมีข้อผิดพลาดฉันจะดำเนินการตามความเหมาะสมเพื่อปิดการเชื่อมต่อฐานข้อมูลหรืออะไรก็ตามในส่วนคำสั่งสุดท้ายและส่งคืนค่าว่าง นี่เป็นแนวปฏิบัติที่ดีไม่เพียงเพราะมันทำให้โค้ดของคุณง่ายขึ้น แต่ยังเพราะ "null" ส่งข้อความเดียวกับที่คุณอาจได้รับจากข้อยกเว้น .. บางสิ่งบางอย่างไม่เป็นไปตามแผนที่วางไว้ จัดการข้อยกเว้นเฉพาะในวิธีการดึงข้อมูล แต่จัดการสิ่งที่ต้องทำเมื่อสิ่งต่าง ๆ ไม่ได้ '
ตัวอย่างเช่น:
Integer getUserCount() {
Integer result = null;
try {
// Attempt to open database and retrieve data
} catch (TimeoutException e) {
logger.error("Got a watch?");
} catch (MissingDatabaseException e) {
logger.error("What are you smoking?");
} catch (PermissionsToReadException e) {
logger.error("Did you *really* think you were getting away with that?");
} catch (PressedSendButtonToHardException e) {
logger.error("Seriously.. just back away from the computer... slowly..");
} catch (WTFException e) {
logger.error("You're on your own with this one.. I don't even know what happened..");
} finally {
// Close connections and whatnot
}
return result;
}
void doStuff() {
Integer result = getUserCount();
if(result != null) {
// Went as planned..
}
}