捕捉所有错误

时间:2014-06-08 15:03:39

标签: 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;
}

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

2 个答案:

答案 0 :(得分:7)

当堆栈为空时,

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

关于捕获所有错误的意图,我认为优良做法是在try-catch中放置main以捕获从其他任何地方逃脱的任何内容,以及如果异常实际被抛出,你应该能够捕获。只需处理一些问题:

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

答案 1 :(得分:1)

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 ++实现,它可能会更清晰地定义,并且您可能能够捕获它。