为什么是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();
导致响应被重定向到正确的应用程序错误页面。这种行为是故意的吗,还是有其他我不理解的事情在起作用?
这不应该发生。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);
}