c# - 使用 Controller 级别异常日志记录 (IExceptionFilter.OnException) 时会漏掉哪些异常?

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

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

当前方法使用 IExceptionFilter.OnException。该功能应用于 BaseContorller,所有其他 Controller 都继承自 BaseContorller,并且看起来(稍微简化)如下:

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

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

  • 源自 Controller 操作方法内代码的异常

  • 源自 Controller 方法返回的 View 的异常, 包括编译错误

  • 应用于 Controller 的过滤器中的异常

但是,使用此方法无法捕获某些异常:

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

您能想到 Controller 级异常处理可能会忽略的任何其他类型的异常吗?

我这么问是因为我可能会使用 Application_Error 或 ELMAH 实现额外的日志记录层,并且我想验证这些异常是否都不会漏掉。

最佳答案

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

多加一层 Elmah 并没有什么坏处,但我可能会选择其中一个。如果您将错误处理分散化,则调试时的工作量可能会增加一倍。

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

由于 Elmah 接近 ASP.NET 金属,因此我会坚持使用 Elmah 并将异常保留在一处。

 NuGet Install-Package Elmah.MVC

顺便说一句,您可能仍然希望记录器进行跟踪,但这在代码中比未处理的异常表达得更明确。

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

关于c# - 使用 Controller 级别异常日志记录 (IExceptionFilter.OnException) 时会漏掉哪些异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14150677/

相关文章:

c# - 我应该如何在当前 session 中存储动态 css 文件名

c# - System.Text.Json - DefaultValueHandling = DefaultValueHandling.忽略替代方案

c# - 使用列名检索数据的 MySQL 查询

c# - 使用 PowerPoint 2010 互操作的笔和记号笔

c# - 为什么在使用 OleDb 导入 Excel 时忽略第一个空行

asp.net - bundle 中的文件排序 - 已知的库有哪些?

c# - Web API 和 MVC 异常处理

c# - 错误 : Object reference not set to an instance of an object

c# - 读取所有字节后 TcpListener 挂起

c# - 方法参数的动态长度