我有 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/