ในความเห็นของฉันข้อยกเว้นเป็นเครื่องมือสำคัญในการตรวจจับข้อผิดพลาดของรหัสในขณะใช้งาน ทั้งในการทดสอบและการผลิต ทำให้ข้อความของพวกเขามีความละเอียดมากขึ้นเมื่อใช้ร่วมกับการติดตามสแต็กคุณสามารถทราบว่าเกิดอะไรขึ้นจากบันทึก
ข้อยกเว้นส่วนใหญ่เป็นเครื่องมือในการพัฒนาและวิธีการรับรายงานข้อผิดพลาดที่สมเหตุสมผลจากการผลิตในกรณีที่ไม่คาดคิด
นอกเหนือจากการแยกข้อกังวล (เส้นทางที่มีความสุขโดยมีข้อผิดพลาดที่คาดไว้เท่านั้นและล้มลงไปจนถึงตัวจัดการทั่วไปสำหรับข้อผิดพลาดที่ไม่คาดคิด) เป็นสิ่งที่ดีทำให้รหัสของคุณอ่านง่ายขึ้นและดูแลรักษาได้ กรณีที่ไม่คาดคิดแม้ด้วยการ bloating ด้วยรหัสการจัดการข้อผิดพลาดเพื่อให้อ่านไม่ได้
ที่จริงแล้วความหมายของ "คาดไม่ถึง"
Btw. สิ่งที่คาดหวังและสิ่งที่ไม่ใช่การตัดสินใจที่สามารถทำได้ที่ไซต์การโทรเท่านั้น นั่นเป็นเหตุผลที่ข้อยกเว้นที่ตรวจสอบใน Java ไม่ได้ผลการตัดสินใจจะทำในเวลาที่พัฒนา API เมื่อมันไม่ชัดเจนในสิ่งที่คาดหวังหรือไม่คาดคิด
ตัวอย่างง่ายๆ: API ของแฮชแผนที่มีสองวิธี:
Value get(Key)
และ
Option<Value> getOption(key)
การขว้างข้อยกเว้นเป็นครั้งแรกหากไม่พบหลังจะให้ค่าที่เป็นทางเลือกแก่คุณ ในบางกรณีหลังมีเหตุผลมากกว่า แต่ในบางกรณีโค้ดของคุณจะต้องคาดหวังว่าจะมีค่าสำหรับคีย์ที่กำหนดดังนั้นหากไม่มีคีย์นั่นคือข้อผิดพลาดที่รหัสนี้ไม่สามารถแก้ไขได้เพราะพื้นฐาน การสันนิษฐานล้มเหลว ในกรณีนี้มันเป็นพฤติกรรมที่ต้องการที่จะหลุดออกจากเส้นทางของรหัสและลงไปที่ตัวจัดการทั่วไปในกรณีที่การโทรล้มเหลว
รหัสไม่ควรพยายามจัดการกับสมมติฐานพื้นฐานที่ล้มเหลว
ยกเว้นโดยการตรวจสอบพวกเขาและโยนข้อยกเว้นที่อ่านได้ดีแน่นอน
การโยนข้อยกเว้นไม่ใช่ความชั่ว แต่การจับพวกมันอาจจะเป็น อย่าพยายามแก้ไขข้อผิดพลาดที่ไม่คาดคิด ตรวจสอบข้อยกเว้นในไม่กี่แห่งที่คุณต้องการดำเนินการวนรอบต่อไปหรือดำเนินการต่อบันทึกพวกเขาอาจรายงานข้อผิดพลาดที่ไม่รู้จักและนั่นคือ
บล็อกที่จับได้ทั่วสถานที่นั้นเป็นความคิดที่แย่มาก
ออกแบบ API ของคุณในแบบที่ทำให้ง่ายต่อการแสดงเจตนาเช่นประกาศว่าคุณคาดว่าจะมีบางกรณีเช่นไม่พบคีย์หรือไม่ จากนั้นผู้ใช้ API ของคุณสามารถเลือกการโทรออกสำหรับกรณีที่คาดไม่ถึงจริงๆเท่านั้น
ฉันเดาว่าเหตุผลที่ผู้คนไม่พอใจข้อยกเว้นและไปไกลเกินไปโดยการละเว้นเครื่องมือสำคัญนี้สำหรับการจัดการข้อผิดพลาดโดยอัตโนมัติและการแยกข้อกังวลจากภาษาใหม่เป็นประสบการณ์ที่ไม่ดี
และบางคนเข้าใจผิดเกี่ยวกับสิ่งที่พวกเขาดีจริงๆ
การจำลองพวกเขาด้วยการทำทุกอย่างผ่านการเชื่อมแบบ monadic ทำให้โค้ดของคุณอ่านง่ายและบำรุงรักษาน้อยลงและคุณก็จบลงด้วยการไม่มีร่องรอยการติดตามซึ่งทำให้วิธีนี้เลวร้ายลง
การจัดการข้อผิดพลาดของรูปแบบการทำงานนั้นยอดเยี่ยมสำหรับกรณีข้อผิดพลาดที่คาดไว้
ให้การจัดการข้อยกเว้นดูแลส่วนที่เหลือโดยอัตโนมัตินั่นคือสิ่งที่มีไว้สำหรับ :)
panic
ซึ่งไม่เหมือนกัน นอกจากนี้สิ่งที่มีการพูดมีข้อยกเว้นไม่มากไปกว่าวิธีที่ซับซ้อน (แต่สะดวกสบาย) ที่จะดำเนินการGOTO
แม้ว่าจะไม่มีใครเรียกมันเป็นอย่างนั้นด้วยเหตุผลที่ชัดเจน