ฉันพยายามโน้มน้าวให้ทีมของฉันอนุญาตให้ใช้ข้อยกเว้นใน C ++ แทนการส่งคืนบูลisSuccessful
หรือ enum ด้วยรหัสข้อผิดพลาด อย่างไรก็ตามฉันไม่สามารถตอบโต้คำวิจารณ์ของเขาได้
พิจารณาห้องสมุดนี้:
class OpenFileException() : public std::runtime_error {
}
void B();
void C();
/** Does blah and blah. */
void B() {
// The developer of B() either forgot to handle C()'s exception or
// chooses not to handle it and let it go up the stack.
C();
};
/** Does blah blah.
*
* @raise OpenFileException When we failed to open the file. */
void C() {
throw new OpenFileException();
};
พิจารณานักพัฒนาที่เรียกใช้
B()
ฟังก์ชัน เขาตรวจสอบเอกสารและเห็นว่าไม่มีข้อยกเว้นดังนั้นเขาจึงไม่พยายามตรวจจับอะไรเลย รหัสนี้อาจผิดพลาดของโปรแกรมในการผลิตพิจารณานักพัฒนาที่เรียกใช้
C()
ฟังก์ชัน เขาไม่ตรวจสอบเอกสารดังนั้นจึงไม่ตรวจพบข้อยกเว้นใด ๆ การโทรไม่ปลอดภัยและอาจทำให้โปรแกรมหยุดทำงาน
แต่ถ้าเราตรวจสอบข้อผิดพลาดด้วยวิธีนี้:
void old_C(myenum &return_code);
ผู้พัฒนาที่ใช้ฟังก์ชั่นนั้นจะได้รับคำเตือนจากคอมไพเลอร์หากเขาไม่ได้ระบุเหตุผลนั้นและเขาจะพูดว่า "อ๊ะนี่จะส่งคืนรหัสข้อผิดพลาดที่ฉันต้องตรวจสอบ"
ฉันจะใช้ข้อยกเว้นได้อย่างปลอดภัยเพื่อให้มีสัญญาบางประเภทได้อย่างไร
Either
/ Result
monad เพื่อส่งคืนข้อผิดพลาดในรูปแบบที่ปลอดภัยสำหรับการจัดพิมพ์