最后在try catch/finally语句中有什么意义

Ali*_*Ali 65 exception-handling finally

我已经使用了多种语言的try-catch/except-finally变种多年,今天有人问我最后的意思是什么,我无法回答.

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

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


try{//a}
catch{//b}
//c
Run Code Online (Sandbox Code Playgroud)

编辑:人
,我知道最后做了什么,我已经使用了很长时间,但我的问题是在上面的例子中放入//c最后似乎多余,不是吗?

sup*_*cat 90

finally块的目的是确保代码在三种情况下运行,而这些情况不会仅仅使用"catch"块来处理:

  1. 如果`try`块中的代码通过`return`退出
  2. 如果catch块中的代码重新捕获捕获的异常,或者 - 意外或故意 - 最终会抛出一个新异常.
  3. 如果`try`块中的代码遇到没有catch的异常.

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

顺便说一下,我希望语言设计者会包含的一件事就是exceptionfinally块的一个参数,以处理在异常之后需要清理但仍希望它渗透调用堆栈的情况(例如,可以包装代码这样一个构造中的构造函数,以及Dispose构造函数将以异常退出的构造对象).

  • 我们试过了,你抓住了,我们终于得到了这个问题的答案! (13认同)
  • 我认为这里的关键是即使在try / catch语句中有一个return语句,它也可以执行。没有这种理解,`finally`子句就显得微不足道,因为知道'catch all'本质上将允许try / catch块之后的代码执行,而不管异常。非常感谢@supercat! (2认同)
  • 抱歉,第三个是错误的。您可以在控制台应用程序 Visual Studio 2019 中尝试一个简单的 try 和finally 块。在 try 块中抛出异常,不捕获它,finally 块将永远不会被调用... (2认同)