捕捉所有错误

use*_*398 1 c++ exception

在我的程序中,我想捕获函数中的每个错误.我尝试过使用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;
}
Run Code Online (Sandbox Code Playgroud)

这仍然导致程序退出.如何捕获任何错误,或者如果不可能,则会发生此特定错误?

Rak*_*kib 7

stack::pop()exception当堆栈为空时不会抛出任何东西.相反,它是从空堆栈弹出的未定义行为.由于没有抛出异常,你的catch子句无法捕获任何内容,而是程序终止(任何事情都可能发生在UB中).

所以,你的意图捕获所有的错误,我认为这是把一个很好的实践try-catchmain,以捕捉到任何来自任何其他地方逃出来的,你应该能够赶上如果异常实际上是被抛出.只需处理一些问题:

  1. catch如果有任何UB,控制可能无法到达您的区块.
  2. C++不能同时处理多个异常,在这种情况下,程序最有可能在它发生的地方终止(特别要小心,以便异常不会留下任何析构函数).
  3. 抛出不在函数的异常规范列表中的异常(最有可能的程序将终止).