我是否必须手动重新引发异常
Do I have to manually rethrow an exception?
我有以下调用层次结构:
A 类 ->B 类 -> C 类
如果在类 C 中抛出异常,而我想在类 A 中处理它,我是否必须在类 B 中手动重新抛出它,或者它是否通过调用层次结构冒泡?
如果你在途中的任何地方都没有抓住它,它会自动冒泡。一个完整的代码示例:
#include <iostream>
#include <exception>
using namespace std;
void C()
{
throw exception();
}
void B()
{
C();
}
void A()
{
try {
B();
} catch (exception& e) {
cout << e.what(); // Here you can access the exception thrown by C()
}
}
int main()
{
A();
}
我假设它的设置方式是:class A::method()
调用class B::method()
调用class C::method()
,
异常对象的构造将调用堆栈展开:
控制流向后工作(在调用堆栈上(,直到到达
try
块的开头,此时所有关联的 catch 块的参数将按出现顺序与异常对象的类型进行比较以查找匹配项(有关此过程的详细信息,请参阅try-catch
(。如果未找到匹配项,控制流将继续展开堆栈,直到下一个try
块,依此类推。如果找到匹配项,控制流将跳转到匹配的 catch 块。
通常,清理是此"堆栈展开"的一部分,直到与抛出的异常对象(或与任何异常对象匹配的catch(...)
(匹配的catch
块。但是,如果没有找到这样的catch
块terminate
则调用,并且标准不要求清理对象。
异常
会"冒泡"调用堆栈,直到找到处理程序std::terminate
或调用处理程序(如果没有(。
注意:在发生动态异常规范冲突的情况下,使用自定义unexpected
处理程序时,您可能会看到不同的行为。
相关文章:
- 孤立代码块在结构中引发异常
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 尝试使用智能指针时引发异常
- 如果分配数组引发异常,是否应该释放该数组
- 引发异常的方法的命名约定 (C++)?
- 读取文件时引发异常
- 在类 12.exe 中0x7B37FF80 (ucrtbased.dll) 引发异常: 0xC0000005:访问冲突读
- 从 C++ 中异常的构造函数引发异常
- 尝试将数字写入二进制文件时引发异常
- 在基于英语的系统上将 UTF-8 路径转换为宽字符会引发异常
- zeromq 在 I/O 线程中引发异常
- 发生此错误:在0x0F2BFB7C(基于.dll)时引发异常 尝试更改大小是问题吗?
- 添加新行时工作代码引发异常.调试技巧?
- 重新引发异常保留回溯
- 引发异常:写访问冲突. temp 为 nullptr
- 删除无效地址时C++引发异常
- 从二进制文件中读取元素时引发异常(引发异常:读取访问冲突. _Pnext 0xB414D4)
- 引发异常
- 是否允许分配器构造和销毁成员函数从内部逻辑引发异常?
- 我的数组大小调整代码在新数据上引发异常[size_t]