在较长的 Winforms 中断之后,我回到了 ASP.NET 领域——我又回到了应该工作的东西上——但实际上不是......
我正在尝试实现一个全局 ASP.NET 错误处理程序和一个向开发人员显示错误的页面(在 DEV 环境中)。
在global.asax.cs
中,我捕获了如下未处理的错误:
private void Application_Error(object sender, EventArgs e)
{
Exception ex = Server.GetLastError();
if (ex != null)
{
HttpContext.Current.Items["exception"] = ex;
// do a bit more stuff here, like logging the error and so on
Server.Transfer("~/Error.aspx");
}
}
(PS:作为旁注:正在使用Server.GetLastError()
还是HttpContext.Current.Error
首选方式?真的找不到任何关于什么更好用的确凿事实,以及为什么)
在我的“开发”错误页面中,我试图在屏幕上显示错误 - 但试图得到该错误似乎难以捉摸 - 我只会回来null
......
public partial class Error : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
// both "exc" as well as "exc2" always end up being "null" ...
Exception exc = HttpContext.Current.Error;
Exception exc2 = HttpContext.Current.Items["exception"] as Exception;
// display error .....
}
为什么?我假设如果我使用Server.Transfer()
该错误仍然存在(我从不调用Server.ClearError()
),并且如果那不起作用,那么我希望至少将异常粘贴到HttpContext.Items
其中会起作用,因为那仍然是在同一内部运行的代码HTTP 上下文/请求 - 不是吗?
我在这里想念什么?否则,我如何将异常信息“传输”global.asax.cs
到单独的错误页面中?
感谢所有提示和指示!
更新:好的——似乎这并不总是发生——在某些情况下,这种机制工作得很好(正如我所期望的那样)。
但是:我在页面上有一个网格,其中包含ImageButton
编辑和删除等操作。我已经定义了一个MyGridViewHandleRowCommand
事件处理程序来处理这些命令——但这似乎不起作用。每当我单击其中一个图像按钮时,我的错误页面就会被激活 - 是的,代码似乎完全绕过了我的全局Application_Error
处理程序global.asax
!在这种情况下,我无法在错误页面中获得有关错误的任何信息 - 一切都为空.....