3

如果我写这段代码

  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进程..... (其他人也会有麻烦)...

你能回答我的问题吗?

谢谢。

4

3 回答 3

1

这很有可能是大名鼎鼎的StackoverflowException。这是由无限循环引起的,因为您Page_Load一次又一次地调用该方法。

来自 MSDN:

在 .NET Framework 的早期版本中,您的应用程序可以捕获 StackOverflowException 对象(例如,从无界递归中恢复)。但是,目前不鼓励这种做法,因为需要大量额外的代码才能可靠地捕获堆栈溢出异常并继续执行程序。

从 .NET Framework 2.0 版开始,StackOverflowException 对象无法被 try-catch 块捕获,相应的进程默认终止。因此,建议用户编写代码来检测和防止堆栈溢出。例如,如果您的应用程序依赖于递归,请使用计数器或状态条件来终止递归循环。请注意,承载公共语言运行时(CLR)的应用程序可以指定CLR卸载发生堆栈溢出异常的应用程序域,并让相应的进程继续进行。有关详细信息,请参阅 ICLRPolicyManager 接口和托管概述。

你可能想看看这个答案:

https://stackoverflow.com/a/4802309/284240

于 2012-04-17T13:09:44.663 回答
0

异常的原因是内存溢出。应用程序如何导致这种情况有很多种方式,没有必要去猜测具体的场景。我应该保护良好的托管服务提供商免受行为不端的应用程序的影响。

于 2012-04-17T13:14:01.253 回答
-3

添加到已经可用的答案。你不能关闭整个过程,因为服务器中的每个网站都在单独的 AppDomain 中运行。所以如果你的代码行为不端,只有你的 appdomain 会被杀死。

于 2012-04-17T13:17:15.057 回答