捕获所有错误

Catching all errors

本文关键字:有错误      更新时间:2023-10-16

在我的程序中,我想捕获函数中的每个错误。我已经尝试使用try/catch,但程序仍然退出。我已经设置了一个我想要捕获的示例

#include <iostream>
#include <stack>
using namespace std;
int main()
{
    stack<string> test;
    test.push("lel");
    try {
        test.pop();
        test.pop();
    }
    catch (...) {
        cout << "Caught" << endl;
    }
    return 0;
}

这仍然会导致程序退出。我如何捕获任何错误,或者如果不可能,捕获这个特定的错误?

当堆栈为空时,stack::pop()不会抛出任何exception。而是未定义的行为从空堆栈弹出。因为没有异常被抛出,你的catch子句不能捕获任何东西,而是程序终止(任何事情都可能发生在UB)。

所以关于捕获所有错误的意图,我认为在main中放置try-catch以捕获从任何其他地方逃脱的任何东西是很好的做法,并且您应该能够捕获如果异常实际上正在抛出。只需要处理一些问题:
    在任何UB的情况下,
  1. 控件可能无法到达您的catch块。c++不能同时处理一个以上的异常,在这种情况下,程序很可能会在发生异常的地方终止(特别要小心,以免异常留下任何析构函数)。
  2. 抛出不在函数异常说明列表中的异常(很可能程序会终止)。

std::stack::pop函数由c11++§23.6.5.2定义为

void pop() { c.pop_back(); }
c++ 11§23.2.3/16中的表101对pop_pack的调用提出了以下要求:

";<我>要求: a.empty() false

这意味着在空堆栈上调用pop打破了函数的契约,因此具有未定义行为。

没有可移植的方法来检测效果,无论它对您的c++实现和程序的特定运行结果如何。但是对于给定的c++实现,它可能定义得更清楚,这样您就可以捕获它。