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
中?
如果你想记录异常,你必须将代码放在你的 ExceptionHandler
或 Application_Error
中(它们是一样的)。 ExceptionFilter
是对错误进行分类。 Application_Error
在应用抛出异常时处理错误。
ExceptionFilter
通过您的错误逻辑对错误进行分离和分类,ExceptionLogger
通过您的错误日志记录逻辑记录错误发生的时间。
简而言之,您可以将代码放在 Application_Error
中 global.asax
显然,您需要记录所有未处理的异常以监控应用程序的整体健康状况。为此,使用 ExceptionHandler 将是您的最佳选择.
如果抛出未处理的异常,将按相同的顺序由以下对象接收:
- 异常记录器
- 异常过滤器
- ExceptionHandler(如果未处理)
为了更好地理解它们之间的区别,我将解释它们的用途。
异常记录器
查看 Web 捕获的所有未处理异常的解决方案 API。在您点击控制器的操作之前或在控制器已经 return 编辑了操作结果响应之后,有可能抛出异常(请记住,来自操作的 return 值不会直接进入浏览器,但由 request/response 管道进一步处理)。
例如控制器的构造函数、路由、响应序列化等过程中可能出现异常
可以注册多个异常记录器,在出现异常时将调用所有异常记录器。
请注意,异常记录器在异常过滤器之前被调用,它们将在异常过滤器中被处理,因此如果记录这些,您可能会得到很多不相关的信息。
目的: 查看所有未处理的异常(甚至在它们到达异常过滤器之前)
范围: 全球
异常过滤器
使用这个来处理预期的异常(例如,您的业务逻辑抛出的 UnauthorizedException)并根据异常类型自定义响应。换句话说,用它来处理异常(例如,如果异常是 UnathorizedException,则将用户重定向到登录页面)。
第一个处理异常的过滤器"wins",这样即使异常已经被处理(响应对象已设置)也不会调用其他异常处理程序
- 目的: 处理(不是日志)异常
- 范围: 每个动作,每个控制器,全局
异常处理程序
这个可以而且应该用于记录未处理的异常。每个申请只能注册一个。它还可用于向用户显示一般错误页面 - "An unknown error has occured".
- 目的:记录和处理unpredictable/unexpected异常
- 范围: 全球
我建议看看这个article
我正在读这个 article 并且似乎有三个不同的异常事件。
我想使用像 Serilog 这样的日志记录框架来捕获异常。
我应该将日志记录代码放在 ExceptionFilter
,然后是 ExceptionLogger
,然后是 ExceptionHandler
?我假设他们都可以访问完整的异常堆栈。
此外,我是否也应该将日志记录代码放在 global.asax
中的 Application_Error
中?
如果你想记录异常,你必须将代码放在你的 ExceptionHandler
或 Application_Error
中(它们是一样的)。 ExceptionFilter
是对错误进行分类。 Application_Error
在应用抛出异常时处理错误。
ExceptionFilter
通过您的错误逻辑对错误进行分离和分类,ExceptionLogger
通过您的错误日志记录逻辑记录错误发生的时间。
简而言之,您可以将代码放在 Application_Error
中 global.asax
显然,您需要记录所有未处理的异常以监控应用程序的整体健康状况。为此,使用 ExceptionHandler 将是您的最佳选择.
如果抛出未处理的异常,将按相同的顺序由以下对象接收:
- 异常记录器
- 异常过滤器
- ExceptionHandler(如果未处理)
为了更好地理解它们之间的区别,我将解释它们的用途。
异常记录器
查看 Web 捕获的所有未处理异常的解决方案 API。在您点击控制器的操作之前或在控制器已经 return 编辑了操作结果响应之后,有可能抛出异常(请记住,来自操作的 return 值不会直接进入浏览器,但由 request/response 管道进一步处理)。
例如控制器的构造函数、路由、响应序列化等过程中可能出现异常
可以注册多个异常记录器,在出现异常时将调用所有异常记录器。
请注意,异常记录器在异常过滤器之前被调用,它们将在异常过滤器中被处理,因此如果记录这些,您可能会得到很多不相关的信息。
目的: 查看所有未处理的异常(甚至在它们到达异常过滤器之前)
范围: 全球
异常过滤器
使用这个来处理预期的异常(例如,您的业务逻辑抛出的 UnauthorizedException)并根据异常类型自定义响应。换句话说,用它来处理异常(例如,如果异常是 UnathorizedException,则将用户重定向到登录页面)。
第一个处理异常的过滤器"wins",这样即使异常已经被处理(响应对象已设置)也不会调用其他异常处理程序
- 目的: 处理(不是日志)异常
- 范围: 每个动作,每个控制器,全局
异常处理程序
这个可以而且应该用于记录未处理的异常。每个申请只能注册一个。它还可用于向用户显示一般错误页面 - "An unknown error has occured".
- 目的:记录和处理unpredictable/unexpected异常
- 范围: 全球
我建议看看这个article