我有以下调用层次结构:
A类 - > B级 - > C级
如果在C类中抛出异常并且我想在A类中处理它,我是否必须在B类中手动重新抛出它,或者它是否在调用层次结构中冒泡?
答案 0 :(得分:2)
如果你在路上的任何地方都没有抓住它,它会自动冒泡。一个完整的代码示例:
INSERT INTO test (sometext) VALUES (?),(?)
答案 1 :(得分:2)
异常"起泡"调用堆栈,直到找到处理程序,否则调用std::terminate
。
注意:如果违反动态异常规范,您可能会看到自定义unexpected
处理程序的不同行为。
答案 2 :(得分:2)
我假设设置方式为:class A::method()
调用class B::method()
来电class C::method()
,
异常对象的构造将调用Stack Unwinding:
控制流向后工作(向上调用堆栈),直到它到达
try
块的开头,此时所有关联的catch块的参数将按顺序进行比较外观,使用异常对象的类型来查找匹配项(有关此过程的详细信息,请参阅try-catch
)。如果未找到匹配项,则控制流将继续展开堆栈,直到下一个try
块,依此类推。如果找到匹配项,则控制流将跳转到匹配的catch块。
通常清理是这个问题的一部分" Stack Unwinding"最多catch
- 块匹配抛出的异常对象(或匹配任何异常对象的catch(...)
)。但如果没有找到catch
- 块,则会调用terminate
,标准不要求清除对象。