我试图说服我的团队领导者允许在C ++中使用异常,而不是返回isSuccessful
带有错误代码的布尔值或枚举。但是,我不能反驳他的批评。
考虑这个库:
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以类型安全的可组合方式返回错误