我正在阅读此article,似乎有三种不同的异常事件。
我想使用Serilog之类的日志记录框架来捕获异常。
我应该将日志记录代码放入ExceptionFilter
,然后放入ExceptionLogger
,然后放入ExceptionHandler
吗?我认为他们都可以访问完整的异常堆栈。
另外,我还应该将日志记录代码放在Application_Error
的{{1}}中吗?
答案 0 :(得分:7)
显然,您需要记录所有未处理的异常以监视应用程序的总体运行状况。为此,使用 ExceptionHandler将是您的最佳选择 。
如果引发了未处理的异常,则它将由以下对象以相同的顺序接收:
为了更好地理解它们之间的区别,我将解释它们的目的。
解决方案,以查看Web API捕获的所有未处理的异常。甚至在您击中控制器的动作之前或在控制器已经返回动作结果响应之后,都可能引发异常(请记住,动作的返回值不会直接传递给浏览器,而是由请求/响应进一步处理管道)。
例如,在控制器的构造函数,路由,响应序列化等过程中可能会发生异常
可能会注册多个异常记录器,并且在发生异常情况时将全部调用它们。
请注意,异常记录器在异常过滤器之前被调用,将在异常过滤器中进行处理,因此如果记录这些异常记录器,则可能会得到很多不相关的信息。
目的:查看所有未处理的异常(甚至在到达异常过滤器之前)
范围:全局
使用此代码处理预期的异常(例如,业务逻辑抛出的UnauthorizedException),并根据异常类型自定义响应。换句话说,使用它来处理异常(例如,如果异常为UnathorizedException,则将用户重定向到登录页面)。
第一个处理异常“ wins”的过滤器,这样,即使已经处理了异常(设置了响应对象),其他异常处理程序也不会被调用
这个可以并且应该用于记录未处理的异常。每个申请只能注册一个。它也可以用于向用户显示一般错误页面-“发生未知错误”。
我建议看看这个article
答案 1 :(得分:0)
如果要记录异常,则必须将代码放入ExceptionHandler
或Application_Error
中(相同)。 ExceptionFilter
对错误进行分类。如果应用抛出异常,Application_Error
会处理错误。
ExceptionFilter
通过错误逻辑对错误进行分类和分类,ExceptionLogger
通过错误日志逻辑记录错误发生的时间。
简而言之,您可以将代码放在Application_Error
的{{1}}中