为什么是ASP.NET似乎以不同的方式处理框架和web应用程序引发的异常

本文关键字:框架 处理 web 应用程序 异常 方式 为什么 NET ASP | 更新日期: 2023-09-27 17:58:30

我发现ASP中的代码引发了异常。NET 3.5 web应用程序,ASP。NET抛出的那些框架代码。让我举例说明:

这个例外:

//some code   
throw new Exception("Something bad happened.");

尽管compilation debug="false"和customErrors mode="On"defaultRedirect=。。。web.config中的设置!鉴于此:

//some code
//throw new Exception("Something bad happened.");
object test = null;
test.ToString();

导致响应被重定向到正确的应用程序错误页面。这种行为是故意的吗,还是有其他我不理解的事情在起作用?

为什么是ASP.NET似乎以不同的方式处理框架和web应用程序引发的异常

这不应该发生。throw new Exception("Something bad happened.")以与((string)null).ToString()相同的方式触发全局异常处理程序。

1) 确保您是Global.asax.cs中正确声明的事件处理程序

public class Global : System.Web.HttpApplication {
  protected void Application_Error(object sender, EventArgs e) {
    // handle exception here   
  }
}

2) 从新线程或服务方法(.asmx、.svc)激发的异常未被Application_Error 捕获

[ServiceContract]
public interface IService {
  [OperationContract]
  void DoWork();
}
public class Service : IService {
    public void DoWork() {
        throw new Exception("No Application_Error for me, please.");
    }
}
protected void Page_Load(object sender, EventArgs e) {
  new Thread(() => {
    throw new Exception("No Application_Error for me, either.");
  }).Start();
}

3) 存在两个糟糕的异常StackOverflowException和OutOfMemoryException,当你把它们放入像这样的代码中时,它们的处理方式确实不同

throw new StackOverflowException();    
throw new OutOfMemoryException();

Application_Error处理程序正在被调用,但当它们"真正"发生时,它们也会破坏域的状态,并且在这些情况下不会调用处理程序(因为它们还关闭了应用程序池)。

protected void Page_Load(object sender, EventArgs e) {
  // enjoy stack overflow in a little while
  this.Page_Load(sender, e);
}