16

我们的 ASP.NET 2 Web 应用程序非常优雅地处理异常。我们在 Application_Error 中捕获 Global ASAX 中的异常。从那里我们记录异常并向用户显示友好的消息。

然而,今天早上我们部署了我们网站的最新版本。它运行了半个小时,但随后 App Pool 崩溃了。在我们恢复之前的版本之前,该站点没有恢复。

如何使应用程序池崩溃并跳过正常的异常处理程序?我正在尝试复制这个问题,但到目前为止还没有运气。


更新:我们找到了解决方案。我们的一个页面正在截屏另一个页面。但是 URL 配置不正确,页面最终被无限截屏,从而导致堆栈溢出异常。

4

4 回答 4

14

我看到的最常见的错误和“池崩溃”是循环调用。

public string sMyText
{
   get {return sMyText;}
   set {sMyText = value;}
} 

只需调用 sMyText ...

于 2010-06-15T12:37:24.697 回答
13

为此,您需要做的就是从request 的上下文之外抛出任何异常(当然不处理它) 。

例如,在另一个线程上引发的一些异常应该这样做:

protected void Page_Load(object sender, EventArgs e)
{
   // Create a thread to throw an exception
   var thread = new Thread(() => { throw new ArgumentException(); });

   // Start the thread to throw the exception
   thread.Start();

   // Wait a short while to give the thread time to start and throw
   Thread.Sleep(50);
}

更多信息可以在 MS 知识库中找到

于 2010-06-15T12:13:35.580 回答
4

亚里士多斯的回答很好。当有人将覆盖方法从 OnInit 更改为 OnLoad 而不更改基本调用时,我也看到它在页面生命周期中使用愚蠢的覆盖完成,因此它在整个生命周期中循环循环:即

protected override void OnLoad(EventArgs e)
{
  //some other most likely rubbish code
  base.OnInit(e);
}
于 2010-06-15T13:15:47.963 回答
1

你可以尝试扔一个ThreadAbortException.

于 2010-06-15T11:45:39.827 回答