C++ 异常处理-离开catch后会发生什么

C++ 异常处理-离开catch后会发生什么,c++,exception-handling,C++,Exception Handling,因此,假设您捕获了一个异常,然后在捕获过程中写入一个日志文件,说明发生了一些异常。然后,您希望程序继续运行,因此必须确保某些不变量仍处于良好状态。然而,在异常被catch“处理”之后,系统中实际发生了什么 此时堆栈已展开,那么它如何恢复其状态呢?捕获异常后,您需要确保应用程序恢复到稳定状态。通常,它是通过“忘记”产生异常的任何操作或更改,并在更高级别上重新开始来实现的 这包括确保在导致异常的事件链期间分配的任何资源得到适当释放。在C++中,确保这一标准的习惯用法是.< /P> 更新 例如,如果在

因此,假设您捕获了一个异常,然后在捕获过程中写入一个日志文件,说明发生了一些异常。然后,您希望程序继续运行,因此必须确保某些不变量仍处于良好状态。然而,在异常被catch“处理”之后,系统中实际发生了什么


此时堆栈已展开,那么它如何恢复其状态呢?

捕获异常后,您需要确保应用程序恢复到稳定状态。通常,它是通过“忘记”产生异常的任何操作或更改,并在更高级别上重新开始来实现的

这包括确保在导致异常的事件链期间分配的任何资源得到适当释放。在C++中,确保这一标准的习惯用法是.< /P> 更新
例如,如果在web服务器中处理请求时发生错误,则会在某个较低级别的函数中生成异常,该异常会在较高级别的类中捕获(可能正好在顶级请求处理程序中)。通常,最好的做法是回滚所做的任何更改,释放到目前为止分配的与实际请求相关的任何资源,并向客户端返回适当的错误消息。更改可能包括数据库事务、文件写入等-必须以异常安全的方式实现所有这些。数据库通常具有内置事务来处理此问题;使用其他资源可能会更加棘手。

如果在每个函数中都有异常处理,您可以在下一个更高级别上继续,但它相当复杂,事实上,我使用异常主要是为了检测尽可能接近源的错误,但不使用它们来恢复执行


另一方面,如果存在可预测的错误,可以设计方案来处理,但对我来说,异常被视为异常,因此我倾向于尝试优雅地退出,而不是在发生异常的日志文件中给出一个很好的提示。JM2CW这取决于应用程序。安全方面也有例外。对于整个应用程序,您描述的级别很难实现


然而,某些代码片段可以通过使用RAII等技术,并通过巧妙地对操作序列排序,使其“故障透明”。我可以想象一段代码查询多个url的数据,例如:当一个url“抛出”时,其余的url仍然可以处理。或者可以重试…

只有在
try
中创建的对象在展开过程中才会被销毁。如果发生异常,程序状态保持一致——这就是所谓的异常安全性

C++不在乎-它展开堆栈,然后将控制传递到适当的
catch
,然后控制流继续正常运行。

“堆栈展开”意味着
throw
和匹配的
catch
子句之间的所有作用域都被保留,为这些作用域中的所有自动对象调用析构函数,与从函数返回时留下函数作用域的方式几乎相同

没有其他“特殊”操作,一个
catch
子句的范围是一个正常范围,离开它与离开
else
子句的范围没有区别


如果您需要确保某些不变量仍然有效,那么您需要以线程安全的方式编写更改它们的代码。戴夫·亚伯拉罕斯写道,你可能想读一读。基本上,在抛出异常时,为了安全起见,您必须使用

它不能。异常在C++中是不可恢复的。在大多数情况下也是如此 现代语言;最早支持的一些语言 异常确实支持可恢复的异常,并且发现 这不是个好主意

如果你想从某个特定的点恢复,你需要 你必须把你的“尝试/抓住”牌放在那里。如果你只是想登录
然后继续,首先不要抛出异常。

你能举一个简单的例子说明你是如何做到这一点的吗,因为在一个大的应用程序中,它看起来并不那么简单…@Tony,我添加了一个例子,希望能有所帮助。恢复与终止是本课程中许多有趣的话题之一。