When is finally run if you throw an exception from the catch block?

后端 未结 7 1540
没有蜡笔的小新
没有蜡笔的小新 2020-11-28 05:06
try {
   // Do stuff
}
catch (Exception e) {
   throw;
}
finally {
   // Clean up
}

In the above block when is the finally block called? Before the

7条回答
  •  Happy的楠姐
    2020-11-28 05:11

    After reading all of the answers here it looks like the final answer is it depends:

    • If you re-throw an exception within the catch block, and that exception is caught inside of another catch block, everything executes according to the documentation.

    • However, if the re-trown exception is unhandled, the finally never executes.

    I tested this code sample in VS2010 w/ C# 4.0

    static void Main()
        {
            Console.WriteLine("Example 1: re-throw inside of another try block:");
    
            try
            {
                Console.WriteLine("--outer try");
                try
                {
                    Console.WriteLine("----inner try");
                    throw new Exception();
                }
                catch
                {
                    Console.WriteLine("----inner catch");
                    throw;
                }
                finally
                {
                    Console.WriteLine("----inner finally");
                }
            }
            catch
            {
                Console.WriteLine("--outer catch");
                // swallow
            }
            finally
            {
                Console.WriteLine("--outer finally");
            }
            Console.WriteLine("Huzzah!");
    
            Console.WriteLine();
            Console.WriteLine("Example 2: re-throw outside of another try block:");
            try
            {
                Console.WriteLine("--try");
                throw new Exception();
            }
            catch
            {
                Console.WriteLine("--catch");
                throw;
            }
            finally
            {
                Console.WriteLine("--finally");
            }
    
            Console.ReadLine();
        }
    

    Here is the output:

    Example 1: re-throw inside of another try block:
    --outer try
    ----inner try
    ----inner catch
    ----inner finally
    --outer catch
    --outer finally
    Huzzah!

    Example 2: re-throw outside of another try block:
    --try
    --catch

    Unhandled Exception: System.Exception: Exception of type 'System.Exception' was thrown.
    at ConsoleApplication1.Program.Main() in C:\local source\ConsoleApplication1\Program.cs:line 53

提交回复
热议问题