我写了一个简单的程序来测试一个理论,即“最终”块总是会执行,无论如何。 但是,我从下面的pgm看到的是控制似乎永远不会进入外部最终区块。
我尝试在Visual Studio中执行F5和Ctrl-F5,结果相同。
有人可以解释为什么我会看到这种行为吗?
控制台窗口的输出是:
内部捕获
内心终于
外部捕获
未处理的例外:
..然后应用程序崩溃
public class Program
{
static void Main()
{
try
{
try
{
string s = null;
s.ToString();
}
catch
{
Console.WriteLine("inner catch");
throw;
}
finally
{
Console.WriteLine("inner finally");
}
return;
}
catch
{
Console.WriteLine("outer catch");
throw;
}
finally
{
Console.WriteLine("outer finally");
}
}
}
答案 0 :(得分:8)
在处理异常之后运行“外部最终”。
以下是在调试器外部运行此代码的输出:
inner catch inner finally outer catch Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object. at SOConsole.Program.Main() in c:\Users\DaveShaw\Documents\Visual Studio 11\Pro jects\SO\SOConsole\Program.cs:line 35 outer finally Press any key to continue . . .
发生异常时,显示以下内容:
点击“取消”后,应用程序恢复并显示“外部最终”。
如果由于某种原因你在有机会进入“最终外部”之前关闭你的应用程序,那么你将永远不会看到你的消息。如果应用程序的进程被“终止”,则跳过最后的进程,以防它们包含阻止应用程序关闭的代码。否则可能无法终止该过程。
答案 1 :(得分:4)
应用程序很可能在刷新stdout缓冲区之前终止。
在外部 - 最后(在WriteLine
上)添加一个断点,或者从外部添加不同的异常 - 最后确认。 finally
不被跳过:这样做会是一个严重的错误!