Web API 2中的ExceptionFilter vs ExceptionLogger与ExceptionHandler

Jac*_*ack 4 c# asp.net exception-handling exception asp.net-web-api

我正在阅读这篇文章,似乎有三种不同的异常事件.

我想使用像Serilog这样的日志框架来捕获异常.

我应该在把日志代码ExceptionFilter,然后ExceptionLogger,再ExceptionHandler?我假设他们都可以访问完整的异常堆栈.

此外,我应该也把日志代码中Application_Errorglobal.asax

小智 14

显然,您需要记录所有未公开的异常,以监控应用程序的整体运行状况.为此,使用ExceptionHandler将是您的最佳选择.

如果抛出了一个无法处理的异常,它将以相同的顺序被以下内容接收:

  1. ExceptionLogger
  2. ExceptionFilter
  3. ExceptionHandler(如果没有处理)

为了更好地理解它们之间的区别,我将解释每个的目的.


ExceptionLogger

查看Web API捕获的所有未处理异常的解决方案.在你击中控制器的动作之前或者在控制器已经返回动作结果响应之后,有可能抛出异常(请记住,动作的返回值不会直接进入浏览器,而是由请求/响应进一步处理管道).

例如,在路由,响应序列化等过程中,控制器的构造函数中可能会发生异常

可以注册多个异常记录器,如果发生异常,将调用所有异常记录器.

请注意异常记录器在异常过滤器之前被调用,它们将在异常过滤器中被处理,因此如果记录它们,您可能会获得大量不相关的信息.

  • 目的:查看所有未处理的异常(甚至在它们到达异常过滤器之前)

  • 范围:全球


ExceptionFilter

使用此方法处理预期的异常(例如,业务逻辑抛出的UnauthorizedException)并根据异常类型自定义响应.换句话说,使用它来处理异常(例如,如果异常是UnathorizedException,则将用户重定向到登录页面).

第一个过滤器来处理异常"wins",这样如果已经处理了异常,则甚至不会调用其他异常处理程序(设置了响应对象)

  • 目的:处理(不记录)异常
  • 范围:每个操作,每个控制器,全局

的ExceptionHandler

这个可以而且应该用于记录未公开的异常.每个应用程序只能注册一个.它还可以用于向用户显示一般错误页面 - "发生未知错误".

  • 目的:记录和处理不可预测/意外的异常
  • 范围:全球

我建议看一下这篇文章