[英]ASP.NET 4.0 Webforms - global error handling troubles
经过更长时间的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
事件处理程序来处理这些命令 - 但这似乎不起作用。 每当我点击其中一个图像按钮时,我的错误页面就会被激活 - 是的,代码似乎完全绕过我在global.asax
全局Application_Error
处理程序! 在这种情况下,我无法在错误页面中获得有关错误的任何信息 - 一切都是null .....
问题是在Ajax调用期间出现了问题,并且异步错误处理不能通过Application_OnError
处理“正常”错误处理,但有自己的“路径”来到错误页面。 这就是为什么我的错误页面被击中,但没有找到错误。
除此之外,全局错误处理(对于非Ajax调用)按预期和编码工作。
我猜你正在将items设置为Items
属性,也许我可以在传输页面之前使用Server.ClearError()
。
在我的代码中,我将异常放在Session中并使用重定向到错误页面。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.