我是否必须手动重新抛出异常?

时间:2016-04-12 11:03:09

标签: c++ exception

我有以下调用层次结构:

A类 - > B级 - > C级

如果在C类中抛出异常并且我想在A类中处理它,我是否必须在B类中手动重新抛出它,或者它是否在调用层次结构中冒泡?

3 个答案:

答案 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,标准要求清除对象。