1

在维基百科中,我们读到

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

我不想过于迂腐,无论如何,但我真的不知道如何解释这一点。这是口误还是正确?处理程序不能catch保证至少被执行吗?

我知道 RAII 及其是什么,我在这里只关注可以保证执行的唯一代码(..)是驻留在堆栈上的对象的析构函数

4

2 回答 2

2

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

至于处理程序本身,当然,只有当匹配的 catch 处理程序确实存在catch时才可能执行处理程序。catch

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

如评论中所述,另一种典型情况是在由先前异常触发的堆栈展开期间引发新异常。这将导致terminate被调用。

于 2013-08-30T15:42:56.630 回答
0

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

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

于 2013-08-30T15:37:43.377 回答