Web 中的 ExceptionFilter vs ExceptionLogger vs ExceptionHandler API 2

ExceptionFilter vs ExceptionLogger vs ExceptionHandler in Web API 2

我正在读这个 article 并且似乎有三个不同的异常事件。

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

我应该将日志记录代码放在 ExceptionFilter,然后是 ExceptionLogger,然后是 ExceptionHandler?我假设他们都可以访问完整的异常堆栈。

此外,我是否也应该将日志记录代码放在 global.asax 中的 Application_Error 中?

如果你想记录异常,你必须将代码放在你的 ExceptionHandlerApplication_Error 中(它们是一样的)。 ExceptionFilter 是对错误进行分类。 Application_Error 在应用抛出异常时处理错误。

ExceptionFilter 通过您的错误逻辑对错误进行分离和分类,ExceptionLogger 通过您的错误日志记录逻辑记录错误发生的时间。

简而言之,您可以将代码放在 Application_Errorglobal.asax

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

如果抛出未处理的异常,将按相同的顺序由以下对象接收:

  1. 异常记录器
  2. 异常过滤器
  3. ExceptionHandler(如果未处理)

为了更好地理解它们之间的区别,我将解释它们的用途。


异常记录器

查看 Web 捕获的所有未处理异常的解决方案 API。在您点击控制器的操作之前或在控制器已经 return 编辑了操作结果响应之后,有可能抛出异常(请记住,来自操作的 return 值不会直接进入浏览器,但由 request/response 管道进一步处理)。

例如控制器的构造函数、路由、响应序列化等过程中可能出现异常

可以注册多个异常记录器,在出现异常时将调用所有异常记录器。

请注意,异常记录器在异常过滤器之前被调用,它们将在异常过滤器中被处理,因此如果记录这些,您可能会得到很多不相关的信息。

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

  • 范围: 全球


异常过滤器

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

第一个处理异常的过滤器"wins",这样即使异常已经被处理(响应对象已设置)也不会调用其他异常处理程序

  • 目的: 处理(不是日志)异常
  • 范围: 每个动作,每个控制器,全局

异常处理程序

这个可以而且应该用于记录未处理的异常。每个申请只能注册一个。它还可用于向用户显示一般错误页面 - "An unknown error has occured".

  • 目的:记录和处理unpredictable/unexpected异常
  • 范围: 全球

我建议看看这个article