Are there any circumstances under which the finally block does not get executed?
本问题已经有最佳答案,请猛点这里访问。
请注意此代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | 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...!"); } } } } |
最后永远不会执行,因为我们得到了堆栈溢出错误。
在任何情况下,除了以上问题?
原因是这是一个不稳定的条件,不允许可靠的错误恢复(毕竟您的堆栈是不可用的!例如,您可以不打电话给日志记录或发送电子邮件。堆栈上没有空间。)
另一种类型是outofmemoryException(甚至不能分配异常-这就是为什么clr预先分配一个oom实例…)。我认为ASP.NET可以容忍这种情况,而SQL Server会杀死您的AppDomain。
对于正常的例外情况,这是正常的。
这永远不会执行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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"); } } } } |