exception - try catch/except finally 语句中的finally有什么意义

标签 exception finally

多年来,我在许多语言中使用了 try-catch/except-finally 变体,今天有人问我 finally 的意义是什么,我无法回答。

基本上,为什么要在finally中放入一条语句,而不是仅仅将其放在整个try-catch block 之后?或者换句话说,以下代码块之间是否存在差异:

try{ //a}
catch {//b}
finally {//c}


try{//a}
catch{//b}
//c

编辑:
人们,我知道finally的作用,我已经使用它很多年了,但我的问题是在上面的示例中将//c放在finally中似乎是多余的,不是吗?

最佳答案

finally block 的目的是确保代码在三种情况下运行,而单独使用“catch” block 无法清楚地处理这些情况:

  1. 如果try block 中的代码通过fallthrough或return退出
  2. 如果catch block 中的代码重新抛出捕获的异常,或者(无意或有意)最终抛出一个新异常。
  3. 如果 try block 中的代码遇到 try 没有 catch 的异常。

可以在每次 return 或 throw 之前复制 finally 代码,并将 catch block 包装在自己的 try/catch 中,以允许发生意外异常的可能性,但放弃所有这些并简单地使用 finally block 要容易得多。

顺便说一句,我希望语言设计者能够在 finally block 中包含一个 exception 参数,以处理在执行完之后需要清理的情况。异常,但仍然希望它渗透到调用堆栈中(例如,可以将构造函数的代码包装在这样的构造中,如果构造函数要因异常退出,则Dispose正在构造的对象) .

关于exception - try catch/except finally 语句中的finally有什么意义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9687849/

相关文章:

C++:我应该捕获所有异常还是让程序崩溃?

java - 特定类的异常处理/映射

java - 最后关闭连接和声明

c++ - C++中finally的实现

javascript - 如何添加 polyfill 以支持 Edge 中的 finally()?

c# "finally" block ,仅在异常时运行

java - Eclipse 插件开发 - 处理许多文件,将 MultiPageEditor 标记为脏抛出异常

java - 自定义异常错误继承

windows - C++ try-catch block 无法捕获硬件异常

java - 在带有finally block 的方法中放置return 语句