ถ้าภาษาสนับสนุนข้อยกเว้นโดยเนื้อแท้แล้วมันก็ควรจะโยนข้อยกเว้นและลูกค้าสามารถตรวจจับข้อยกเว้นหากพวกเขาไม่ต้องการให้ส่งผลให้เกิดความล้มเหลว ในความเป็นจริงลูกค้าของรหัสของคุณคาดหวังข้อยกเว้นและจะพบข้อบกพร่องมากมายเพราะพวกเขาจะไม่ได้ตรวจสอบค่าตอบแทน
มีข้อดีเล็กน้อยสำหรับการใช้ข้อยกเว้นหากคุณมีตัวเลือก
ข้อความ
ข้อยกเว้นมีข้อความแสดงข้อผิดพลาดที่ผู้ใช้สามารถอ่านได้ซึ่งนักพัฒนาสามารถใช้สำหรับการดีบักหรือแสดงต่อผู้ใช้หากต้องการ หากรหัสการบริโภคไม่สามารถจัดการกับข้อยกเว้นมันสามารถบันทึกมันเสมอเพื่อให้นักพัฒนาสามารถผ่านบันทึกโดยไม่ต้องหยุดการติดตามอื่น ๆ เพื่อหาสิ่งที่เป็นค่าตอบแทนและแผนที่ในตารางเพื่อหาสิ่งที่เป็น ข้อยกเว้นจริง
ด้วยค่าที่ส่งคืนจะไม่มีข้อมูลเพิ่มเติมที่สามารถให้ได้อย่างง่ายดาย บางภาษาจะรองรับการเรียกใช้เมธอดเพื่อรับข้อความแสดงข้อผิดพลาดล่าสุดดังนั้นข้อกังวลนี้จะได้รับการชดเชยเล็กน้อย แต่นั่นต้องให้ผู้โทรทำการโทรเพิ่มเติมและบางครั้งจะต้องเข้าถึง 'วัตถุพิเศษ' ที่มีข้อมูลนี้
ในกรณีของข้อความแสดงข้อยกเว้นฉันให้บริบทมากที่สุดเท่าที่จะทำได้เช่น:
ไม่สามารถเรียกนโยบายของชื่อ "foo" สำหรับผู้ใช้ "bar" ซึ่งถูกอ้างอิงในโปรไฟล์ผู้ใช้
เปรียบเทียบสิ่งนี้กับโค้ดส่งคืน -85 คุณจะเลือกอันไหน
โทรสแต็ค
ข้อยกเว้นมักจะมีรายละเอียดการโทรที่ช่วยแก้ไขรหัสได้เร็วขึ้นและเร็วขึ้นและยังสามารถบันทึกได้ด้วยรหัสการโทรหากต้องการ สิ่งนี้ช่วยให้นักพัฒนาสามารถระบุปัญหาได้ตามปกติและมีประสิทธิภาพมาก เปรียบเทียบสิ่งนี้กับไฟล์บันทึกด้วยค่าส่งคืน (เช่น -85, 101, 0, ฯลฯ ) ซึ่งคุณต้องการเลือกอันไหน
ล้มเหลววิธีเอนเอียงที่รวดเร็ว
หากวิธีการหนึ่งเรียกว่าบางที่ล้มเหลวก็จะโยนข้อยกเว้น รหัสการโทรต้องระงับข้อยกเว้นอย่างชัดเจนไม่เช่นนั้นจะล้มเหลว ฉันพบว่าสิ่งนี้น่าทึ่งจริง ๆ เพราะในระหว่างการพัฒนาและการทดสอบ (และแม้กระทั่งในการผลิต) รหัสล้มเหลวอย่างรวดเร็วบังคับให้นักพัฒนาแก้ไข ในกรณีของค่าส่งคืนหากไม่ได้รับการตรวจสอบค่าส่งคืนข้อผิดพลาดจะถูกละเว้นอย่างเงียบ ๆ และพื้นผิวของบั๊กที่ไม่คาดคิดมักจะมีค่าใช้จ่ายสูงกว่ามากในการดีบักและแก้ไข
การห่อและแกะข้อยกเว้น
สามารถห่อข้อยกเว้นไว้ในข้อยกเว้นอื่น ๆ แล้วแกะถ้าจำเป็น ตัวอย่างเช่นรหัสของคุณอาจArgumentNullException
มีรหัสที่อาจตัดภายในUnableToRetrievePolicyException
เนื่องจากการดำเนินการนั้นล้มเหลวในรหัสโทร ในขณะที่ผู้ใช้อาจแสดงข้อความคล้ายกับตัวอย่างที่ฉันให้ไว้ข้างต้นรหัสการวินิจฉัยบางอย่างอาจแกะข้อยกเว้นและพบว่าArgumentNullException
มีสาเหตุของปัญหาซึ่งหมายความว่ามันเป็นข้อผิดพลาดการเข้ารหัสในรหัสของผู้บริโภคของคุณ สิ่งนี้อาจเริ่มการแจ้งเตือนเพื่อให้ผู้พัฒนาสามารถแก้ไขรหัสได้ สถานการณ์ขั้นสูงดังกล่าวไม่ใช่เรื่องง่ายที่จะใช้กับค่าส่งคืน
ความเรียบง่ายของรหัส
อันนี้ค่อนข้างยากที่จะอธิบาย แต่ฉันเรียนรู้จากการเขียนโค้ดนี้ทั้งค่าตอบแทนและข้อยกเว้น รหัสที่เขียนขึ้นโดยใช้ค่าส่งคืนมักจะทำการโทรแล้วมีชุดของการตรวจสอบเกี่ยวกับสิ่งที่เป็นค่าตอบแทน ในบางกรณีมันจะทำการโทรไปยังวิธีอื่นและตอนนี้จะมีการตรวจสอบชุดอื่นสำหรับค่าส่งคืนจากวิธีการนั้น ด้วยข้อยกเว้นการจัดการข้อยกเว้นนั้นง่ายกว่าในทุกกรณี คุณมีการลอง / จับ / ในที่สุดบล็อกด้วยรันไทม์พยายามอย่างดีที่สุดในการรันโค้ดในบล็อกสุดท้ายเพื่อทำความสะอาด แม้แต่บล็อก try / catch / สุดท้ายที่ซ้อนกันนั้นค่อนข้างง่ายกว่าในการติดตามและดูแลรักษามากกว่าซ้อนกันถ้า / อื่น ๆ และค่าส่งคืนที่เชื่อมโยงจากหลายวิธี
ข้อสรุป
หากแพลตฟอร์มที่คุณใช้รองรับข้อยกเว้น (โดยเฉพาะเช่น Java หรือ. NET) คุณควรสมมติว่าไม่มีทางอื่นนอกจากการส่งข้อยกเว้นเนื่องจากแพลตฟอร์มเหล่านี้มีแนวทางในการโยนข้อยกเว้นและลูกค้าของคุณคาดหวัง ดังนั้น. หากฉันใช้ห้องสมุดของคุณฉันจะไม่สนใจตรวจสอบค่าที่ส่งคืนเพราะฉันคาดว่าจะมีข้อยกเว้นเกิดขึ้นนั่นเป็นสิ่งที่โลกในแพลตฟอร์มเหล่านี้เป็น
อย่างไรก็ตามหากเป็น C ++ มันจะเป็นการยากกว่าที่จะกำหนดเนื่องจากมี codebase ขนาดใหญ่อยู่แล้วกับรหัสส่งคืนและนักพัฒนาจำนวนมากจะถูกปรับให้ส่งคืนค่าเมื่อเทียบกับข้อยกเว้น (เช่น Windows มีมากมายกับ HRESULTs) . นอกจากนี้ในหลาย ๆ แอปพลิเคชันอาจเป็นปัญหาด้านประสิทธิภาพด้วย (หรืออย่างน้อยก็รับรู้ได้)
try
/catch
มีอยู่สำหรับ นอกจากนี้คุณสามารถเพิ่มtry
/catch
เพิ่มกองซ้อนของคุณในตำแหน่งที่เหมาะสมยิ่งขึ้นเพื่อจัดการกับมัน (ช่วยให้แยกความกังวลได้มากขึ้น)