我正在编写一个通用链表类,并且正在我的反向迭代器类中重载 * 运算符。这是我拥有的:
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),没有额外费用。
catch (...)
对于这种情况来说太宽泛了。那捕获了一切。您真的应该尝试将其限制为std::out_of_range
或其祖先之一。否则,您会将意想不到的事情混入您的 catch block 中,并且您可能不会准备好处理它们。
关于c++ - 如何处理异常以便我的程序仍然运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13805741/