我正在编写一个C ++类,它有两种不同的使用模型。一个是外部的,我们假设用户不希望引发任何异常。而是返回错误代码。 另一种使用方式是内部,我努力避免繁琐的错误代码检查,并且更愿意处理异常。
结合这两种方法的好方法是什么?
修改
答案 0 :(得分:1)
创建该类的两个版本,一个抛出,另一个返回错误代码。它们都可以从包含大量代码的公共基础派生。
答案 1 :(得分:1)
我比Mark更喜欢Mark Ransom的回答,除非因为其他原因而创建两个类是不可行的。
作为替代方法,您可以创建接口,以便每个函数都有一个带有默认值的final参数,例如int * pRet = NULL。如果pRet == NULL表示使用异常。如果pRet!= NULL,则调用者传入一个指针,该指针应该在函数末尾用错误代码更新。
在函数内部,您需要捕获异常,然后根据pRet参数吞下它们或重新抛出它们。
答案 2 :(得分:0)
从未尝试过这样的事情,但这就是我要做的事情。
错误类型:
extern const bool exceptionmode;
enum error_codes {no_error, whatever};
struct error_type {
error_codes id;
//maybe also a non-owning const char* message?
error_type() :id(no_error) {}
error_type(error_codes code) :id(code)
{
if (exceptionmode) throw_as_exception();
}
const char* get_as_string() {
switch(id) {
case whatever: return "out of bounds exception";
case no_error: return "no error";
default: return "unknown exception";
}
}
void throw_as_exception() {
switch(id) {
case whatever: throw std::out_of_bounds("out of bounds exception");
case no_error: break; //no error
default: throw std::exception("unknown exception");
}
}
};
类和函数:
class myclass {
public:
error_type my_member_function() {
//stuff
if (condition)
return whatever;
//more stuff
return no_error;
}
};
如果你真的很勇敢,你可以这样做,以便error_type类断言,如果它永远不会被比较,转换或检查,以确保没有人忘记检查返回值。