我正在尝试从我维护的网站记录所有“常规错误”,以调试代码隐藏,而不必向用户显示详细的错误页面。 web.config
说:
<customErrors mode="RemoteOnly" defaultRedirect="~/GeneralError.html"/>
适用于除以零,空引用异常,缺少dll等问题。经过大量阅读后,我发现这些是“未处理的异常”,但未到达处理程序Application_Error()
global.asax
。基于每页的工作原理是:
protected override void OnError(EventArgs e)
{
Exception TheException = Server.GetLastError();
// todo: log the exception to the database
base.OnError(e); //pass the exception to the regular handler
return;
}
但是可以更改为使用单个方法记录所有页面的未处理异常吗?如何覆盖或修改基类Page
?
我还想过将日志记录放在GeneralError.aspx
的代码隐藏中,但是没有堆栈跟踪或异常消息,并且任何用户都可以直接调用此页面来惹恼我们。
我调查了一些帖子中提到的IErrorHandler
接口,但这应该与WinForm应用有关,而不是与asp.net网络应用有关。
答案 0 :(得分:2)
使用Global.asax文件中的Application_Error方法。
在Application_Error方法实现中调用Server.GetLastError(),记录Server.GetLastError()返回的异常的详细信息。
Exception LastError;
String ErrMessage;
LastError = Server.GetLastError();
if (LastError != null)
ErrMessage = LastError.Message;
else
ErrMessage = "No Errors";
Response.Write("Last Error = " + ErrMessage);
请见MSDN,或者如果您想在<{3}} 完整的Microsoft示例。
答案 1 :(得分:0)
创建一个新类:
public class MyPage : System.Web.UI.Page
{
protected override void OnError(EventArgs e)
{
Exception TheException = Server.GetLastError();
// todo: log the exception to the database
base.OnError(e); //pass the exception to the regular handler
return;
}
}
而不是继承自System.Web.UI.Page继承自各页的MyPage。
答案 2 :(得分:0)
我目前正在研究https://msdn.microsoft.com/en-us/library/aa479332.aspx,通过https://stackoverflow.com/a/138088/1845672找到,它使用完全相同的方法来解释我的问题:提供一种解决方案,以可维护的方式记录所有页面上的错误,而无需修改所有页面。
微软网站上的下载链接已过时。根据:https://code.google.com/p/elmah/issues/detail?id=64,源代码从microsoft站点移动到:elmah.googlecode.com/files/GDN-ELMAH-1.0.5527-setup.zip。
看起来这是一个完整的解决方案。 。