我在经历了较长的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
处理程序!在这种情况下,我无法获取有关错误的任何信息-一切都为空......