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 Exception();
}
catch (Exception)
{
goto Found;
}
finally
{
Console.Write("{0}\t", i);
}
Why?
Because a
finally
statement is expected to execute after leaving thetry
(orcatch
when an exception is caught). This includes when you make your goto call.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 blockmost of the time.Instead of goto, consider 'return'.
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?
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.
As people have mentioned,
finally
runs no matter the program flow. Of course, thefinally
block is optional, so if you don't need it, don't use it.The following text comes from the C# Language Specification (8.9.3 The goto statement)
A goto statement is executed as follows: