捕获所有错误
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的情况下,
- 控件可能无法到达您的
catch
块。c++不能同时处理一个以上的异常,在这种情况下,程序很可能会在发生异常的地方终止(特别要小心,以免异常留下任何析构函数)。 - 抛出不在函数异常说明列表中的异常(很可能程序会终止)。
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++实现,它可能定义得更清楚,这样您就可以捕获它。
相关文章:
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 我的代码中有错误,未声明的标识符
- C++ LeetCode #377 的 DP 解决方案中,此代码是否有错误?
- 试图建立银行管理系统,但有错误
- 我试图创建临时对象的方式有错误吗
- 我的随机生成器是否不工作,或者我决定人/骨架是否击中对手的方式是否有错误
- 我在OpenCV中有错误的"approxPolyDP(ROI_Vertices, ROI_Poly, 1.0, true)"
- 我在这个 C++ 代码上有错误吗?
- 是视觉C++优化器错误还是我的代码中有错误?
- 为什么一个简单的C++程序会有错误的结果?是 #define 引起的吗?
- 对此有错误
- C :数据文件有错误:预期的无限制ID
- 一个带有参数的程序,为什么此程序有错误的答案
- 仅使用boost.datetime在Windows上有错误
- 使用向量循环时,是否有错误
- Microsoft Visual Studio发现我所有的CUDA设备端函数都有错误
- 继承默认构造函数在 gcc 中失败并在 clang 中工作,哪个有错误?
- 为什么有错误未定义_getws_s
- 在快速排序程序中有错误
- C - 检查CIN是否有错误