【问题标题】:Which Asp.net exceptions can do what?哪些 Asp.net 异常可以做什么?
【发布时间】:2012-04-28 19:46:24
【问题描述】:

如果我写这段代码

  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 关闭?
  • 什么样的异常会导致应用程序池关闭?

附言 根据我刚才写的,请考虑以下场景: 我可以写一个网页,把我的网站托管在一个网站群中,我可以通过创建递归来终止整个 w3wp.exe 进程.....(其他人也会遇到麻烦)...... p>

你能回答我的问题吗?

谢谢。

【问题讨论】:

  • 查看应用程序日志 - 异常详细信息应显示在那里。
  • @moguzalp No. 也在非调试模式下。但那很好。我在生产中没有真正的例外。我只是想了解哪些异常可以终止什么......(只是测试学习)

标签: asp.net iis-7 .net-4.0 exception-handling w3wp


【解决方案1】:

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

来自 MSDN:

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

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

你可能想看看这个答案:

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

【讨论】:

  • 嗨,是的,我知道,但这只是众多例外中的一个。我希望我的思想与:WHICH EXCEPTION (their characteristics) CAN TEMINATE1)AppPool 2)w3wp
  • 我很确定OutOfMemoryException 会有同样的效果。
  • @volpav nope Insufficient memory to continue the execution of the program. w3wp.exe 仍在运行。
  • (好吧,现在我只是猜测)AccessViolationException 怎么样?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 你能尽量保持 txt spch 2 的最小值吗? lso props caps wud b nice.
    猜你喜欢
    • 1970-01-01
    • 2014-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多