ASP.NET 4.0 Webforms - 全局错误处理问题

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");
    }
}

(附注:使用 Server.GetLastError()HttpContext.Current.Error 哪个是更好的方式?我无法找到任何硬性证据说明哪个更好,以及为什么)

在我的“dev”错误页面中,我想在屏幕上显示错误信息-但是似乎很难获得该错误-我只能收到 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事件处理程序来处理这些命令-但似乎不起作用。每当我单击其中一个图像按钮时,我的错误页面都会被激活-是的,该代码似乎完全绕过了我在global.asax中的全局Application_Error处理程序!在这种情况下,我无法获取有关错误的任何信息-一切都为空......

顺便提一下,你考虑过使用 Elmah 吗?http://nuget.org/packages/elmah - MikeSmithDev
3个回答

1

已解决:

问题出在 Ajax 调用过程中出现了错误,异步错误处理不像通过 Application_OnError 的“正常”错误处理那样工作,而是有自己的“路径”来到达错误页面。这就是为什么我的错误页面被访问,但没有找到错误的原因。

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


0

我猜你是在设置Items属性的异常,也许在页面传输之前可以使用Server.ClearError()


0
在我的代码中,我将异常放入一个会话中,并使用重定向到错误页面。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接