在我的程序中,我想捕获函数中的每个错误。我尝试过使用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;
}
这仍然导致程序退出。如何捕获任何错误,或者如果不可能,则会出现此特定错误?
答案 0 :(得分:7)
stack::pop()
不会抛出任何exception
。而是从空堆栈中弹出未定义的行为。由于没有抛出任何异常,您的catch
子句无法捕获任何内容,而是程序终止(任何事情都可能发生在 UB 中)。
关于捕获所有错误的意图,我认为优良做法是在try-catch
中放置main
以捕获从其他任何地方逃脱的任何内容,以及如果异常实际被抛出,你应该能够捕获。只需处理一些问题:
catch
区块。答案 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 ++实现,它可能会更清晰地定义,并且您可能能够捕获它。