c++ - 如何处理异常以便我的程序仍然运行?

标签 c++ c++11 exception

我正在编写一个通用链表类,并且正在我的反向迭代器类中重载 * 运算符。这是我拥有的:

try
{
    return this->item->data;
}
catch (...)
{
    cout << "OUT OF RANGEEEEE" << endl;
}   

item,它是我的链表类的节点,可能是 nullptr,因为我的指针指向 rend() 位置。在那种情况下,我该如何处理该异常以使我的程序仍然运行?我尝试使用此代码运行,但我的程序崩溃了。

另外,只做这样的事情会好吗?

if (item == nullptr)
{
    throw std::out_of_range("Error message here!");
}
else
{
    return this->item->data;
}

编辑: 所以我认为我的第二个实现更好?但是,当我用第二个实现运行我的程序时,我无法继续我的程序。我怎样才能让它更安全,这样我的程序才能继续运行?

最佳答案

一旦您进入 catch block 1,您的程序仍在运行。为了继续,您必须返回 this->item->data 以外的内容。您返回的内容取决于调用您的函数的意义。

恕我直言,这是异常的糟糕用例。到达链表的末尾并不异常(exception),这是正常的和预期的。大概您想抛出一个异常,这样当您到达列表末尾时就不必特例 return this->item->data 。但是为了继续,您必须返回东西,然后您的调用者必须检查它。您只是将该工作转移到另一个地方,并在此过程中支付异常成本。更好的解决方案是在最有意义的地方检查 null 并完成。没有异常(exception),没有额外费用。


  1. catch (...) 对于这种情况来说太宽泛了。那捕获了一切。您真的应该尝试将其限制为 std::out_of_range 或其祖先之一。否则,您会将意想不到的事情混入您的 catch block 中,并且您可能不会准备好处理它们。

关于c++ - 如何处理异常以便我的程序仍然运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13805741/

相关文章:

c++ - 多线程和堆损坏

c++ - 如何将 webkit 集成到 C++ Windows 应用程序中

c++ - 对于 GCC 的 "sorry, unimplemented: cannot expand ‘NEXT ...’ 到固定长度参数列表“错误”,是否有一个很好的解决方法?

c++ - unordered_set 示例编译器错误(哈希和等价函数错误可能)

方法定义中的 Java 异常

java - ZXing 2.1 : com. google.zxing.NotFoundException 异常

c++ - 使用 boost::split 将字符串拆分为 ',',但忽略字符串 C++ 中引号内的文本

c++通过1个数据包中的套接字发送大数据

具有共享互斥锁和类实例的 C++11 线程

exception - Haskell 记录语法并从文件中读取。记录语法的字符串。 *** 异常 : Prelude. 读取:无解析