我应该抛出异常,返回错误代码,还是打印出一些日志并调用abort()?

时间:2016-04-03 14:47:58

标签: exception exception-handling return-code

我有一个课程如下:

class MyBuffer
{
    private:
        char* ptr_;
    public:
        MyBuffer(char* ptr_tmp) : ptr_(ptr_tmp) {};
        void write_data(int val)
        {
            if(ptr_ == NULL)
            {
                // What should I do here?
                // throw an exception, return error code, or just abort()?
            }

            // Write val to the buffer pointed by ptr_
            // ...
        }
};
初始化后无法更改

ptr_。这意味着当且仅当开发人员在构造函数中传递NULL指针时,语句ptr_ == NULL将为true。如果发生这种情况,抛出异常或返回错误代码,处理代码应该立即终止程序。

我已经阅读了几个关于异常和错误的讨论。在我看来,异常应该用于“预测性”但“特殊”的情况。在我的例子中,如果ptr_ == NULL为真,那么这不是一个例外,而是一个错误,对吗?

1 个答案:

答案 0 :(得分:0)

一个古老的困境。

这不是真的归结为你的班级设计,合同与消费者的关系是什么?

如果write_data()永远不应该写,那么异常是有序的,除了我考虑从构造函数中抛出它。我总是喜欢快速失败,所以只要你知道指针无效,因为write_data永远不会工作,那就扔掉它。有些人不同意从构造函数中抛出异常,因为它可以留下部分实例化的类,但这看起来很小。在实际的{}检查null并抛出任何合适的东西(在Java中,你可能会抛出一个InvalidArgumentException)。

如果不能保证实际调用write_data(),那么你基本上可以进行延迟初始化,因此在第一次调用方法时抛出它。

如果合同不保证将任何内容写入缓冲区,因此空指针有效,那么只需记录一条消息并继续。

[我实际上记录了一些东西,使调试更容易,但日志级别可能比严重/致命与警告/信息。]