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

Exception 我应该抛出异常、返回错误代码还是打印一些日志并调用abort()?,exception,exception-handling,return-code,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?

我的课程如下:

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_uu。这意味着,当且仅当开发人员在构造函数中传递空指针时,语句
ptr_==NULL
将为
true
。如果发生这种情况,无论是抛出异常还是返回错误代码,处理代码都应该立即终止程序

我读过几篇关于异常和错误的讨论。在我看来,例外应该用于“预测性”但“例外”的情况。在我的示例中,如果
ptr\u==NULL
为真,这将不是一个例外,而是一个bug,对吗?

一个由来已久的难题

这不是真的要归结到你的课堂设计吗?与消费者的合同是什么

如果WrreEdDATA()不应该写入,那么异常是有序的,除非我考虑从构造函数中抛出它。我总是喜欢快速失败,所以一旦你知道指针是无效的,因为write_数据永远不会工作,那么就把它扔到那里。有些人不同意从构造函数抛出异常,因为它可以留下一个部分实例化的类,但这似乎很小。在实际的{}检查null并抛出任何适当的值(在Java中,您可能会抛出InvalidArgumentException)

如果不能保证write_data()确实会被调用,因此在第一次调用该方法时抛出它,那么实际上可以执行延迟初始化

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

[我实际上会记录一些东西,不管怎样,这会使调试更容易,尽管日志级别可能是严重的/致命的,而不是警告/信息。]

这是一个由来已久的难题

这不是真的要归结到你的课堂设计吗?与消费者的合同是什么

如果WrreEdDATA()不应该写入,那么异常是有序的,除非我考虑从构造函数中抛出它。我总是喜欢快速失败,所以一旦你知道指针是无效的,因为write_数据永远不会工作,那么就把它扔到那里。有些人不同意从构造函数抛出异常,因为它可以留下一个部分实例化的类,但这似乎很小。在实际的{}检查null并抛出任何适当的值(在Java中,您可能会抛出InvalidArgumentException)

如果不能保证write_data()确实会被调用,因此在第一次调用该方法时抛出它,那么实际上可以执行延迟初始化

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


[我实际上会记录一些东西,不管怎样,这会使调试更容易,尽管日志级别可能是严重的/致命的,而不是警告/信息。]

可以说,如果传递了空指针,您应该在初始化过程中退出,而不是在未知的稍后时间。@mustaccio如果我在构造函数中选中了
空指针
,我以后会检查它吗(例如,在write_数据中)?可以说,如果传递了一个空指针,那么您应该在初始化过程中退出,而不是在以后未知的时间。@mustaccio如果我在构造函数中选中了
NULL指针
,我以后是否必须检查它(例如在write_数据中)?