【问题标题】:ExceptionFilter vs ExceptionLogger vs ExceptionHandler in Web API 2Web API 2 中的 ExceptionFilter vs ExceptionLogger vs ExceptionHandler
【发布时间】:2019-06-15 20:36:15
【问题描述】:

我正在阅读此article,似乎存在三种不同的异常事件。

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

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

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

【问题讨论】:

  • 这取决于您要记录的内容。您可以将它们放入所有处理程序中,也可以不放入。

标签: c# asp.net exception asp.net-web-api exception-handling


【解决方案1】:

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

如果抛出一个未处理的异常,它会按相同的顺序被以下接收:

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

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


异常记录器

查看由 Web API 捕获的所有未经处理的异常的解决方案。在您甚至点击控制器的操作之前或在控制器已经返回操作结果响应之后可能会引发异常(请记住,操作的返回值不会直接发送到浏览器,而是由请求/响应进一步处理管道)。

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

可以注册多个异常记录器,所有异常记录器都会被调用。

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

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

  • 范围:全球


异常过滤器

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

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

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

异常处理程序

这个可以而且应该用于记录未经处理的异常。每个申请只能注册一个。它还可用于向用户显示一般错误页面 - “发生未知错误”。

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

我建议看看这个article

【讨论】:

  • 我认为我们应该在异常记录器中使用日志框架,因为来自文档docs.microsoft.com/en-us/aspnet/web-api/overview/error-handling/… - 异常记录器是查看 Web API 捕获的所有未处理异常的解决方案。 - 异常处理程序是自定义对 Web API 捕获的未处理异常的所有可能响应的解决方案。 - 异常过滤器是处理与特定操作或控制器相关的子集未处理异常的最简单的解决方案。
  • 仅供参考,当连接即将中止并且无法发送新的响应消息时,将调用记录器但不会调用处理程序
【解决方案2】:

如果您想记录异常,您必须将代码放入您的ExceptionHandlerApplication_Error(相同)。 ExceptionFilter 对错误进行分类。 Application_Error 在应用程序抛出异常时处理错误。

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

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

【讨论】:

    猜你喜欢
    • 2015-03-23
    • 2014-08-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-01
    • 2016-07-21
    • 1970-01-01
    • 2014-07-19
    • 1970-01-01
    相关资源
    最近更新 更多