Throw Exception In Try Catch Finally
throw-exception-in-try-catch-finally
问题: https://stackoverflow.com/questions/1555567/when-is-finally-run-if-you-throw-an-exception-from-the-catch-block
SF上的一个回答
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
–catchUnhandled Exception: System.Exception: Exception of type ‘System.Exception’ was thrown.
at ConsoleApplication1.Program.Main() in C:\local source\ConsoleApplication1\Program.cs:line 53
更近一步
https://stackoverflow.com/questions/46267044/exception-in-catch-block-means-the-finally-block-never-executes/46267841#46267841
Windows Exception Dispatching(windows 异常处理调度机制)
https://msdn.microsoft.com/en-us/library/windows/desktop/ms679327%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396