【发布时间】:2018-09-29 21:46:38
【问题描述】:
无法理解 ExceptionFilterAttribute 何时调用 OnException 方法。
假设我有 2 个已注册的过滤器:
filters.Add<ExceptionFilter>();
filters.Add<ActionExecutionFilter>();
ExceptionFilter 覆盖 OnException 并且 ActionExecutionFilter 具有 OnActionExecution 并且出于测试目的它具有 OnResultExecuted。
我发现 - 如果我直接将异常抛出到动作中,它会调用 OnException 方法, 但是如果我在我的任何依赖注入服务中抛出异常(参见示例),那么它不会调用 OnException 方法。当在任何这些情况下发生异常时(第二个示例),我知道 ActionFilter 将调用 OnResultExecuted 方法,我可以在其中看到异常,该异常直接进入中间件异常处理程序。
我想知道的是,如果 Result 中有异常,为什么 ExceptionFilter 不调用任何方法。
例子:
public ActionResult SomeActionMethod()
{
throw new Exception("this one calls OnException");
//Logic
}
public ActionResult SomeActionMethod()
{
var result = this._injectedService.ThrowExceptionMethod(); // --> This one doesn't call OnException if it appears
//Logic
}
【问题讨论】:
-
这很奇怪。介意粘贴异常过滤器的内容吗?另外,
ThrowExceptionMethod是异步方法吗(返回Task或Task<T>)?如果是的话,你会等吗?如果不是,则不会捕获异步方法的异常,除非 a)awaited 或 b)task.Result(阻塞,错误,抛出 AggregateException 而不是特定的)或 c)task.GetAwaiter().GetResult()被调用 -
感谢您的评论,非常感谢您的帮助。