2

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

当前方法使用 IExceptionFilter.OnException。该功能应用在 BaseContorller 上,所有其他控制器都继承自 BaseContorller,看起来(略微简化)如下:

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

这种方法效果很好,适用于:

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

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

  • 应用于控制器的过滤器中的异常

但是,使用这种方法不会捕获到一些异常:

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

是否有任何其他类型的异常可以被控制器级异常处理遗漏?

我之所以问,是因为我可能会使用 Application_Error 或 ELMAH 实现额外的日志记录层,并且我想验证这些异常中没有一个会在未记录的情况下溜走。

4

1 回答 1

2

任何不通过 MVC 管道的东西都不会被这个实现捕获。HttpHandlers、WebAPI 实现、ServiceStack 添加等。

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

“是我的伐木工抓到还是 Elmah 抓到了?”

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

 NuGet Install-Package Elmah.MVC

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

 Logger.Info("Just got another Sale, W00t!")
于 2013-01-28T15:33:03.150 回答