Tôi đang cố gắng thuyết phục nhóm của mình để cho phép sử dụng các ngoại lệ trong C ++ thay vì trả lại bool isSuccessful
hoặc enum với mã lỗi. Tuy nhiên, tôi không thể chống lại sự chỉ trích này của anh ấy.
Hãy xem xét thư viện này:
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();
};
Hãy xem xét một nhà phát triển gọi
B()
hàm. Anh ta kiểm tra tài liệu của nó và thấy rằng nó không trả lại ngoại lệ, vì vậy anh ta không cố bắt bất cứ thứ gì. Mã này có thể làm hỏng chương trình trong sản xuất.Hãy xem xét một nhà phát triển gọi
C()
hàm. Anh ta không kiểm tra tài liệu để không bắt ngoại lệ. Cuộc gọi không an toàn và có thể làm hỏng chương trình trong sản xuất.
Nhưng nếu chúng ta kiểm tra lỗi theo cách này:
void old_C(myenum &return_code);
Một nhà phát triển sử dụng chức năng đó sẽ bị trình biên dịch cảnh báo nếu anh ta không cung cấp đối số đó và anh ta nói "Aha, điều này trả về mã lỗi tôi phải kiểm tra."
Làm thế nào tôi có thể sử dụng ngoại lệ một cách an toàn, để có một số loại hợp đồng?
Either
/ Result
đơn vị để trả lại lỗi theo cách có thể kết hợp an toàn loại