为什么在Try ... Catch中使用Finally

awe*_*awe 47 .net vb.net exception-handling try-catch-finally

我看到Finallyin Try .. Catch将始终在try catch块执行的任何部分之后执行.

是否有任何不同,只是跳过该Finally部分,然后在try catch块之外运行它?

示例1,尝试...抓住......最后......结束尝试

    Try
        'Do something
    Catch ex As Exception
        'Handle exception
    Finally
        'Do cleanup
    End Try
Run Code Online (Sandbox Code Playgroud)

例2,尝试......抓住......结束尝试......做最后的事情

    Try
        'Do something
    Catch ex As Exception
        'Handle exception
    End Try
    'Do cleanup
Run Code Online (Sandbox Code Playgroud)

kem*_*002 68

是的,它是不同的.最后将始终运行(禁止程序崩溃).如果函数退出try catch块内部,或者在try或catch中抛出另一个错误,则finally仍将执行.您不会使用finally语句获得该功能.

  • 好吧,你可以做些什么,你可以设计/编写你的代码,这样它就不会使用Exceptions进行流控制,也不会将finally块用于类似的事情.最后应该用于清理,这应该总是发生. (12认同)
  • 不幸的是,如果程序以各种方式崩溃,`finally` 块*默认* 会运行。但是如果你愿意,你可以覆盖它:处理`AppDomain.UnhandledException`来调用`Environment.FailFast`。 (2认同)
  • 事实并非如此,有时甚至可能不会被召唤.就像从操作系统中止程序,或者计算机崩溃一样. (2认同)
  • 它不会执行的两种情况是当执行 try/catch 的线程停止执行或 JVM 终止时。因此,线程可能会停止,程序的其余部分会继续,您永远不会知道(除非有良好的日志/编码)它是否运行。 (2认同)

pas*_*ute 12

带四个单选按钮的代码:

  • 返回TRY
  • 返回CATCH
  • 投掷CATCH
  • 完成CATCH

    private void checkFinally()
    {
        try
        {
            doFinally();
        }
        catch
        {
            Console.WriteLine(" Breaking news: a crash occured. ");
        }
    }
    
    private void doFinally()
    {
        Console.WriteLine(" ");
        Console.Write("Here goes: " 
            + (radioReturnInTry.Checked ? "2. Return in try: " 
                    : (radioReturnInCatch.Checked? "3. Retrun in catch: "
                        : (radioThrowInCatch.Checked? "4. Throw in catch: "
                            : "1. Continue in catch: "))) );
        try
        {
            if (radioReturnInTry.Checked)
            {
                Console.Write(" Returning in try. ");
                return;
            }
            Console.Write(" Throwing up in try.  ");
            throw new Exception("check your checkbox.");
        }
        catch (Exception ex)
        {
            Console.Write(" ...caughtcha! ");
            if (radioReturnInCatch.Checked)
            {
                Console.Write("Returning in catch. ");
                return;
            }
            if (radioThrowInCatch.Checked)
            {
                Console.Write(" Throwing up in catch. ");
                throw new Exception("after caught");
            }
        }
        finally { Console.Write(" Finally!!"); }
        Console.WriteLine(" Done!!!"); // before adding checkboxThrowInCatch, 
        // this would never happen (and was marked grey by ReSharper)
    
    }
    
    Run Code Online (Sandbox Code Playgroud)

输出:

  • 这里是:1.继续捕获:尝试投掷.... caughtcha!最后!!完成!
  • 这里是:2.在尝试中返回:在尝试中返回.最后!!
  • 这里是:3.重新捕获:尝试投掷.... caughtcha!回归陷阱.最后!!
  • 这里是:4.扔进去:尝试投掷.... caughtcha!陷入困境.最后!!突发新闻:发生了崩溃.

总结一下:最后要注意两件事:

  1. 在try或catch 中返回的代码.
  2. 或者如果你在try中有异常,并且在catch中有一个异常,
  3. 或者,如果您在try中有异常,并且DID NOT CATCH该异常,

最后总结一下"最后":如果你试过,最后没有什么特别的,并且

  1. 没有回来,
  2. 并且在审判期间发现了任何例外,然后
  3. 也没有退回渔获物,和
  4. 不要吝啬或有代码抛出.

最后但并非最不重要的(最后):如果你的代码中有一个你没有捕获的异常,你的代码将会飞,而不会达到最终状态.

希望这很清楚.(现在是给我的......)

摩西

  • 懒得阅读和比较条件。要是有人能把它转换成表格形式就好了!! (2认同)

rah*_*hul 7

最后包含需要在所有条件下评估的代码[无论是否发生异常].

如果不执行finally块,就无法退出try块.如果finally块存在,则始终执行.(此声明适用于所有意图和目的.有一种方法可以在不执行finally块的情况下退出try块.如果代码执行System.exit(0);从try块中,应用程序终止而不是finally另一方面,如果你在try块期间拔掉机器,那么finally也不会执行.)

主要用途是处理物体.当您想要关闭用户定义的资源(如文件,打开的资源(db stmts))时,它将非常有用.

编辑

最后也不会在stackoverflow异常后执行.

  • 如果存在StackOverflowException,是否会执行finally块? (5认同)

Ric*_*dle 5

区别在于,当try块中的代码引发该块未捕获的异常时catch

通常,catch块会捕获特定类型的异常,并让其他任何内容通过。在这种情况下,该finally块仍将运行。

如果finally块中的代码,该try块也将运行return