经过更长时间的Winforms中断之后,我又回到了ASP.NET领域 - 我又回到了那些所谓的工作的东西 - 但实际上不是...... / p>
我正在尝试实现一个全局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
首选方式?无法找到关于什么更好使用的任何确凿事实,以及为什么)
并且在我的“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
事件处理程序来处理这些命令 - 但这似乎不起作用。每当我点击其中一个图像按钮时,我的错误页面就会被激活 - 是的,代码似乎完全绕过 Application_Error
中的全局global.asax
处理程序!在这种情况下,我无法在错误页面中获得有关错误的任何信息 - 一切都是空的.....
答案 0 :(得分:1)
问题是在Ajax调用期间出现了问题,并且异步错误处理不能通过Application_OnError
处理“正常”错误处理,但有自己的“路径”来到达错误页面。这就是我的错误页面被击中的原因,但没有找到错误。
除此之外,全局错误处理(对于非Ajax调用)按预期和编码工作。
答案 1 :(得分:0)
我猜你正在设置Items
属性的异常,也许我可以在转移页面之前使用Server.ClearError()
。
答案 2 :(得分:0)
在我的代码中,我将异常放在Session中并使用重定向到错误页面。