是否有任何情况下finally块不会被执行?
问题描述:
请注意,此代码:是否有任何情况下finally块不会被执行?
class CTestFinally
{
public static void Run()
{
try
{
TryAndTry();
}
catch (Exception exError)
{
Console.WriteLine(exError.Message);
}
finally
{
Console.WriteLine("Finally...!");
}
Console.ReadKey();
}
static void TryAndTry()
{
try
{
TryAndTry();
}
catch (Exception exError)
{
Console.WriteLine(exError.Message);
}
finally
{
Console.WriteLine("Try: Finally...!");
}
}
}
}
最后永远不会被执行,因为我们得到的堆栈溢出错误。
有没有什么情况下,除了 以上的问题,finally块不会被执行?
答
StackOverflowException
是CLR主机通常特别对待的少数几种例外之一。例如,ASP.NET将终止工作进程。这是非常难以调试,因为你的应用程序刚刚消失。 SQL Server有类似的策略,我相信(比如卸载appdomain)。
原因是这是一个不稳定的条件,不允许可靠的错误恢复(在所有堆栈不可用的情况下!例如,您可以不打电话给您的记录器或发送电子邮件。叠加)。
另一种是OutOfMemoryException(你甚至不能分配一个异常 - 这就是为什么CLR预先分配一个OOM实例......)。我认为ASP.NET容忍这个,而SQL Server杀死你的appdomain。
对于正常的例外,这工作正常。
+5
在过去的几年里,它也变得非常难以搜索有关StackOverflow例外的信息。:) – 2013-03-25 10:00:32
答
这不会执行finally
:
using System;
namespace Demo
{
public static class Program
{
[STAThread]
public static void Main(string[] args)
{
try
{
Console.WriteLine("In try");
Environment.FailFast("Aaaaaargh");
}
finally
{
Console.WriteLine("In finally");
}
}
}
}
您的电脑吹起来。世界末日。电脑睡觉等... – rhughes 2013-03-25 09:57:11
http://thedailywtf.com/Articles/My-Tales.aspx – 2013-03-25 09:58:14
是的,“最后从未执行,因为我们得到堆栈溢出错误。”是Finally块不会执行的许多情况之一。查看右边的一些关于这个问题的线索。 – 2013-03-25 09:58:40