如果我写这段代码
protected void Page_Load(object sender, EventArgs e)
{
Page_Load(sender, e);
}
我得到一个错误(无限递归):
并且
w3wp.exe
进程从task manager
终止。精细...
但是,如果我这样做:
throw new ApplicationException(); //or SystemException();
它仅显示在常规例外页面中。 (w3wp.exe仍然启动)。
问题:
什么样的异常导致w3wp.exe关闭?
什么样的异常导致应用程序池关闭?
ps
根据我刚才写的内容,请考虑以下情形:
我可以编写一个网页,将我的网站托管在一个站点中,并且可以通过创建递归来终止整个w3wp.exe进程.....(其他人也会遇到麻烦)...
你能回答我的问题吗?
谢谢。
最佳答案
这很可能是著名的StackoverflowException
。它是由无限循环引起的,因为您一次又一次地调用方法Page_Load
。
从MSDN:
在早期版本的.NET Framework中,您的应用程序可能会捕获
一个StackOverflowException对象(例如,从
无限递归)。但是,目前不鼓励这种做法
因为需要大量额外的代码才能可靠地捕获
堆栈溢出异常并继续执行程序。
从.NET Framework 2.0版开始,一个StackOverflowException
try-catch块和相应的对象不能捕获对象
进程默认终止。因此,建议用户
编写他们的代码以检测并防止堆栈溢出。例如,
如果您的应用程序依赖于递归,请使用计数器或状态
条件以终止递归循环。注意一个应用
承载公共语言运行库(CLR)的计算机可以指定CLR
卸载堆栈溢出异常所在的应用程序域
发生并让相应的过程继续。欲了解更多
有关信息,请参阅ICLRPolicyManager接口和托管概述。
您可能想看看这个答案:
https://stackoverflow.com/a/4802309/284240