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_数据中)?