【问题标题】:What exceptions will slip through when using Controller level exception logging (IExceptionFilter.OnException)?使用 Controller 级别的异常记录 (IExceptionFilter.OnException) 时会漏掉哪些异常?
【发布时间】:2012-12-18 12:14:21
【问题描述】:

我有 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 实现额外的日志记录层,并且我想验证这些异常中没有一个会在未记录的情况下漏掉。

【问题讨论】:

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


    【解决方案1】:

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

    多涂一层 Elmah 并没有什么坏处,但我可能会选择其中一种。如果您将错误处理分割成碎片,您可能会在调试时加倍工作。

    “是我的记录器捕捉到了它还是 Elmah 捕捉到了它?”

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

     NuGet Install-Package Elmah.MVC
    

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

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

    【讨论】:

    • 我同意碎片化评论。
    猜你喜欢
    • 2020-04-29
    • 2015-08-28
    • 2014-03-26
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-20
    相关资源
    最近更新 更多