我有一个课程如下:
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
为真,那么这不是一个例外,而是一个错误,对吗?
答案 0 :(得分:0)
一个古老的困境。
这不是真的归结为你的班级设计,合同与消费者的关系是什么?
如果write_data()永远不应该写,那么异常是有序的,除了我考虑从构造函数中抛出它。我总是喜欢快速失败,所以只要你知道指针无效,因为write_data永远不会工作,那就扔掉它。有些人不同意从构造函数中抛出异常,因为它可以留下部分实例化的类,但这看起来很小。在实际的{}检查null并抛出任何合适的东西(在Java中,你可能会抛出一个InvalidArgumentException)。
如果不能保证实际调用write_data(),那么你基本上可以进行延迟初始化,因此在第一次调用方法时抛出它。
如果合同不保证将任何内容写入缓冲区,因此空指针有效,那么只需记录一条消息并继续。
[我实际上记录了一些东西,使调试更容易,但日志级别可能比严重/致命与警告/信息。]