Documentation关于ASP.NET Core中的过滤器。
Documentation关于错误处理。
异常过滤器处理在控制器创建,模型绑定,操作过滤器或操作方法中发生的未处理的异常。它们不会捕获资源过滤器,结果过滤器或MVC结果执行中发生的异常。+
要处理异常,请将ExceptionContext.ExceptionHandled属性设置为true或写入响应。这会停止异常的传播。请注意,Exception过滤器不能将异常转换为“成功”。只有一个Action过滤器可以做到这一点。
异常过滤器适用于捕获MVC操作中发生的异常,但它们不如错误处理中间件那么灵活。在一般情况下优先使用中间件,并且只在需要根据选择哪个MVC操作进行错误处理的地方使用过滤器。
关于“是否停止施加任何进一步的过滤器?”:
- 进一步流水线执行,如果您有未处理的异常,停止为当前的方法停止执行)和异常,直到它在一个较高的水平catch块赶上去堆栈。
但是要记住,最终实现ExceptionFilterAttribute
逻辑仍在进行中。下一个.NET Core MVC 1.1.2中预计会发生一些变化。
我发现下面的有用的解释是GitHub上的问题(Exception Filters returns an empty body):
已经证实在MVC 5.2.3和ASP.NET核心1.1.0 IActionFilters行为相同。但是,IExceptionFilters的行为与w.r.t不同。设置为Result
,但保留ExceptionHandled==false
。应该在设置Resul
t时删除这个特殊情况。
1.1.0行为也是与ASP.NET Core 1.0.x相比的回归。
长的故事有关ASP.NET核心一致的行为:
- 用户可以短路最IFilterMetadata实现通过设置结果。但是,只有在例如OnActionExecuting()可能会短路,但OnActionExecuted()不能。
- 为了使IExceptionFilter实现(仅在出路调用时)短路,用户必须设置ExceptionHandled == true。
- 在所有IFilterMetadata实现中设置ExceptionHandled == true还可确保在操作中抛出的异常不会被重新抛出。在这种情况下使用重写的结果。
- 在与MVC 5.2.3的小故意偏离中,设置Exception == null与设置ExceptionHandled == true的处理方式相同。
来源
2017-03-10 11:29:14
Set