结合基于异常和错误代码的类实现

时间:2012-10-04 21:28:41

标签: c++ exception interface

我正在编写一个C ++类,它有两种不同的使用模型。一个是外部的,我们假设用户不希望引发任何异常。而是返回错误代码。 另一种使用方式是内部,我努力避免繁琐的错误代码检查,并且更愿意处理异常。

结合这两种方法的好方法是什么?

修改

  • 两种方法都可以在同一个二进制文件中使用
  • 明确胜过隐含
  • 避免向用户公开特殊构造。

3 个答案:

答案 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类断言,如果它永远不会被比较,转换或检查,以确保没有人忘记检查返回值。