请注意以下代码:
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块都不会被执行 以上问题?
答案 0 :(得分:5)
StackOverflowException
是CLR主机通常特别处理的少数几种异常之一。例如,ASP.NET将终止工作进程。这非常很难调试,因为你的应用程序就消失了。我确信SQL Server有类似的策略(比如卸载appdomain)。
原因在于这是一个不稳定的情况,不允许可靠的错误恢复(在所有堆栈都无法使用之后!例如,您可以不调用您的记录器或发送电子邮件。堆栈上没有空间)。
另一种类型是OutOfMemoryException(你甚至不能分配一个Exception - 这就是CLR预先分配一个OOM实例的原因......)。我认为ASP.NET容忍这一点,而SQL Server会杀死你的appdomain。
对于正常的例外情况,这样可以正常工作。
答案 1 :(得分:2)
这永远不会执行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");
}
}
}
}