是否保证在抛出异常后执行?

时间:2013-08-30 15:31:16

标签: c++ exception exception-handling stack raii

在维基百科we read中:

  

资源获取是初始化RAII是一种编程习惯用语   用于几种面向对象的语言,如C ++,D,Ada和Vala。   这项技术是由Bjarne Stroustrup发明来处理资源的   C ++中的分配和释放。 在这种语言中,唯一的代码   可以保证在抛出异常后执行   驻留在堆栈中的对象的析构函数

我不想过于迂腐,无论如何,但我真的不确定如何解释这一点。这是滑舌还是这是正确的?是否保证catch处理程序至少不会被执行?

我知道RAII及其含义,我专注于此唯一可以保证执行的代码(..)是驻留在堆栈上的对象的析构函数

2 个答案:

答案 0 :(得分:2)

严格来说,引用已经错了。抛出异常并且没有匹配的处理程序时,可以在不展开堆栈并调用任何析构函数的情况下调用terminate。因此,声明“抛出异常时将执行<析构函数”的语句是错误的。

对于catch处理程序本身,当然,如果匹配的catch处理程序实际上存在,则只能执行catch处理程序。

除此之外,即使处理程序存在,还有其他原因可以在工作中抛出一个扳手,并在异常到达catch处理程序之前过早地终止处理。例如,它会在抛出“意外”异常时发生。如果您的函数异常规范禁止某些特定的异常类型,并且此类“禁止”类型的异常试图“飞出”该函数,则会立即调用unexpected,而不是将控制转移到处理程序。

正如评论中所提到的,另一种典型情况是在前一个异常触发的堆栈展开期间抛出新异常。这将导致terminate被调用。

答案 1 :(得分:0)

我之所以说维基百科是正确的唯一原因是因为如果异常导致整个应用程序崩溃并停止执行,那么它就不会让它归结为“catch”处理程序。在大多数情况下,您可以保证将找到并执行catch子句。

来源:http://msdn.microsoft.com/en-us/library/fk6t46tz.aspx