这是我需要帮助的面试问题。
您有以下ASP.NET代码隐藏类:
public partial class Page1 : Page
{
private string _value;
public Page1()
{
if (DateTime.Now.Ticks % 10 == 0)
_value = "Test";
}
~Page1()
{
if(_value.Equals("Test"))
_value = string.Empty;
}
}
只要有人请求此页面,w3wp.exe
进程就会意外终止。
为什么会出现这种情况,而用户会看到黄色死机屏幕(默认的ASP.NET错误页面)?
为什么托管堆上始终存在OutOfMemoryException?
答案 0 :(得分:18)
提示:永远不要在析构函数/终结器中抛出异常,否则你将终止运行GC的线程,没有GC可能会让事情变得难看。
虽然.NET 1.1中存在一些容忍,但是在后台线程中抛出的异常被消耗掉并且不会使托管进程失效,从CLR 2.0开始不再是这种情况。 Quote from the doc:
如果Finalize或覆盖Finalize 抛出异常和运行时 不是由应用程序托管的 覆盖默认策略 运行时终止进程,没有 积极的尝试 - 终结块或 终结者被执行。这种行为 确保过程完整性 终结者无法释放或毁灭 资源。
在终结者中抛出异常是致命的。