Search code examples
c#exceptiontry-catch-finally

finally block in c#


Possible Duplicate:
Finally Block Not Running??

I have a question regarding finally block in c#. I wrote a small sample code:

public class MyType
{
    public void foo()
    {
        try
        {
            Console.WriteLine("Throw NullReferenceException?");
            string s = Console.ReadLine();
            if (s == "Y")
                throw new NullReferenceException();
            else
                throw new ArgumentException();          
        }
        catch (NullReferenceException)
        {
            Console.WriteLine("NullReferenceException was caught!");
        }
        finally
        {
            Console.WriteLine("finally block");
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        MyType t = new MyType();
        t.foo();
    }
}

As I far as I know, finally block suppose to run deterministicly, whether or not an exception was thrown. Now, if the user enters "Y" - NullReferenceException is thrown, execution moves to the catch clock and then to the finally block as I expected. But if the input is something else - ArgumentException is thrown. There is no suitable catch block to catch this exception, so I thought execution should move the the finally block - but it doesnt. Could someone please explain me why?

thanks everyone :)


Solution

  • Your debugger is probably catching the ArgumentException so it's waiting for you to "handle" it there before entering the final block. Run your code w/o an attached debugger (including w/o your JIT debugger) and it should hit your finally block.

    To disable JIT, go to Options > Tools > Debugging > Just-In-Time and uncheck Managed

    To debug w/o an attached debugger, in Visual Studio go to Debug > Start Without Debugging (or CTRL + F5)

    It would also be helpful to put a Console.ReadLine() at the end of your program to prevent the console from closing after entering your finally block.

    class Program {
        static void Main(string[] args) {
            MyType t = new MyType();
            t.foo();
            Console.ReadLine();
        }
    }
    

    Here is the output you should get:


    Throw NullReferenceException? N

    Unhandled Exception: System.ArgumentException: Value does not fall within the ex pected range.

    at ConsoleSandbox.MyType.foo() in P:\Documents\Sandbox\Console\Console\Consol e\Program.cs:line 17

    at ConsoleSandbox.Program.Main(String[] args) in P:\Documents\Sandbox\Console \Console\Console\Program.cs:line 31

    finally block

    Press any key to continue . . .