使用控制器级别异常日志记录(IExceptionFilter.OnException)时会有什么异常?

时间:2013-01-04 03:27:39

标签: c# .net asp.net-mvc asp.net-mvc-3 error-logging

我有MVC3应用程序,其中非常重要的是,可以正确记录生产中可能发生的所有错误。

当前方法使用IExceptionFilter.OnException。该功能应用于BaseContorller,所有其他控制器都继承该功能,并按以下方式查看(略微简化):

public class BaseController : Controller, IExceptionFilter
{        
    protected override void OnException(ExceptionContext exceptionContext)
    {
        Logger.Error(exceptionContext.Exception);
    }
}

这种方法非常有效,适用于:

  • 源自控制器操作方法中的代码的异常

  • 源自控制器方法返回的视图的异常, 包括编译错误

  • 应用于控制器的过滤器中的例外

但是,有些例外情况不会使用此方法捕获:

  • 控制器构造函数中抛出的异常
  • 应用程序例程中抛出的异常,例如:RegisterGlobalFilters,RegisterRoutes,Application_Start
  • 找不到
  • 页面(404)

您可以想到的任何其他类型的异常可以通过控制器级异常处理来错过吗?

我在问,因为我可能会使用Application_Error或ELMAH实现额外的日志记录层,并且我想验证这些例外是否都没有记录。

1 个答案:

答案 0 :(得分:2)

此实现不会捕获任何未通过MVC管道的内容。 HttpHandlers,WebAPI实现,ServiceStack添加等

另外一层Elmah没有伤害,但我可能只选择一个或另一个。如果您对错误处理进行了分段,那么在调试时可能会使您的工作加倍。

“我的记录器是抓住了它还是Elmah抓住了它?”

由于Elmah接近ASP.NET金属,我只会坚持使用Elmah并将您的例外保存在一个地方。

 NuGet Install-Package Elmah.MVC

作为旁注,您可能仍希望记录器进行跟踪,但在代码中明确表达的内容比未处理的异常更明确。

 Logger.Info("Just got another Sale, W00t!")