3

在较长的 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!在这种情况下,我无法在错误页面中获得有关错误的任何信息 - 一切都为空.....

4

3 回答 3

1

解决了:

问题是在 Ajax 调用期间出现了问题,并且异步错误处理不能像“正常”错误处理那样工作,Application_OnError而是有自己的“路径”来访问错误页面。这就是我的错误页面被点击的原因,但没有找到错误。

除此之外,全局错误处理(对于非 Ajax 调用)按预期和编码工作。

于 2013-01-10T13:56:51.707 回答
0

我想当您将 excption 设置为Items属性时,也许我可以Server.ClearError()在传输页面之前使用。

于 2013-01-10T12:37:19.020 回答
0

在我的代码中,我将异常放在 Session 中并使用重定向到错误页面。

于 2013-01-10T13:29:37.610 回答