【发布时间】:2010-10-08 19:53:13
【问题描述】:
我目前在我的 ASP.NET MVC 应用程序中使用 log4net 来记录异常。我这样做的方式是让我的所有控制器都继承自 BaseController 类。在 BaseController 的 OnActionExecuting 事件中,我记录了所有可能发生的异常:
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
// Log any exceptions
ILog log = LogManager.GetLogger(filterContext.Controller.GetType());
if (filterContext.Exception != null)
{
log.Error("Unhandled exception: " + filterContext.Exception.Message +
". Stack trace: " + filterContext.Exception.StackTrace,
filterContext.Exception);
}
}
如果在控制器操作期间发生未处理的异常,这将非常有用。
至于 404 错误,我在 web.config 中设置了一个自定义错误,如下所示:
<customErrors mode="On">
<error statusCode="404" redirect="~/page-not-found"/>
</customErrors>
在处理“page-not-found”网址的控制器操作中,我记录了请求的原始网址:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult PageNotFound()
{
log.Warn("404 page not found - " + Utils.SafeString(Request.QueryString["aspxerrorpath"]));
return View();
}
这也有效。
我遇到的问题是如何记录 .aspx 页面本身上的错误。假设我在某个页面或某些内联代码上出现编译错误,会引发异常:
<% ThisIsNotAValidFunction(); %>
<% throw new Exception("help!"); %>
HandleError 属性似乎正确地将其重新路由到 Shared 文件夹中的 Error.aspx 页面,但它肯定没有被我的 BaseController 的 OnActionExecuted 方法捕获。我在想我可以将日志记录代码放在 Error.aspx 页面本身上,但我不确定如何在该级别检索错误信息。
【问题讨论】:
-
ELMAH +1。这是我写的ELMAH Tutorial,以帮助您入门。还记得在使用 ASP.NET MVC 时使用 Elmah.MVC 包,以避免自定义错误页面等问题。
标签: asp.net-mvc error-handling