首页 > 解决方案 > 当服务抛出异常时,未调用 ExceptionFilterAttribute.OnException

问题描述

无法理解 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
}

标签: asp.net-core.net-core

解决方案


解决了这个难题。问题根本不在 .net 核心或异常属性中。我正在为 dataManagers 和 dataAccess 实例使用拦截器,因此在我在其中一个实例中引发异常之后,拦截器会包装该错误并将其作为正常结果返回,这会导致 OnResultExecuted 调用其中包含异常。


推荐阅读