Why does this “finally” execute?

前端 未结 8 886
故里飘歌
故里飘歌 2020-12-14 19:02

If you run the code below it actually executes the finally after every call to the goto:

    int i = 0;
Found:
    i++;
    try
    {
        throw new Exc         


        
相关标签:
8条回答
  • 2020-12-14 19:17

    Seems reasonable. A finally block is always run after either the try or the catch.

    Similarly

    try
    {
      // do something
      return;
    }
    finally
    {
      // do something else
    }
    

    will always run the finally block. EDIT - but see Eric's comments above.

    0 讨论(0)
  • 2020-12-14 19:18

    The gist of the answers given - that when control leaves the protected region via any means, whether "return", "goto", "break", "continue" or "throw", the "finally" is executed - is correct. However, I note that almost every answer says something like "the finally block always runs". The finally block does NOT always run. There are many situations in which the finally block does not run.

    Who wants to try to list them all?

    0 讨论(0)
  • 2020-12-14 19:20

    That's by design. In the exception handler you can take some exception-specific action. In the finally block you should do resource cleanup - that's why the finally block is always executed no matter what the exception handling code is.

    0 讨论(0)
  • 2020-12-14 19:24

    Why do you expect it to not execute?

    If you have try/catch/finally or try/finally block, finally block executes no matter what code you may have in the try or catch block most of the time.

    Instead of goto, consider 'return'.

    //imagine this try/catch/finally block is inside a function with return type of bool. 
    try
    {
        throw new Exception();
    }
    catch (Exception)
    {
        return false; //Let's say you put a return here, finally block still executes.
    }
    finally
    {
        Console.WriteLine("I am in finally!");
    }
    
    0 讨论(0)
  • 2020-12-14 19:25

    Because a finally statement is expected to execute after leaving the try (or catch when an exception is caught). This includes when you make your goto call.

    0 讨论(0)
  • 2020-12-14 19:26

    As people have mentioned, finally runs no matter the program flow. Of course, the finally block is optional, so if you don't need it, don't use it.

    0 讨论(0)
提交回复
热议问题