【问题标题】:ExceptionFilterAttribute for ApiController is being ignoredApiController 的 ExceptionFilterAttribute 被忽略
【发布时间】:2014-11-12 12:40:51
【问题描述】:

我正在尝试替换我们当前代码中的错误模式,其中每个控制器操作由一行组成,例如:

HandleExceptions(() => { actual.code.for.action; more.code; yada; yada; yada;});

我为我们的 ApiControllers 构建了一个 ExceptionFilterAttribute。这是你非常标准的 ExceptionFilterAttribute,据我从我看过的文档中可以看出:

public class HandleExceptionsAttribute : ExceptionFilterAttribute
{
    public override void OnException(HttpActionExecutedContext actionExecutedContext)
    {
        if (actionExecutedContext.Exception is SecurityException) { ... }
        else if (actionExecutedContext.Exception is InvalidOperationException) { ... }
        else { base.OnException(actionExecutedContext); }
    }
}

我确实在全局范围内注册了该属性,但现在真的不想在全局范围内注册它:

GlobalConfiguration.Configuration.Filters.Add(new HandleExceptionsAttribute());

出于测试目的,我将其设置为:

        [Route("~/throwAnException")]
        [HttpGet]
        [HandleExceptionsAttribute]
        public blarg[] ThrowSomething() {
            throw new SecurityException("you are not allowed here");
        }

我的 HandleExceptionsAttribute.OnException() 永远不会被调用。为什么?

【问题讨论】:

    标签: asp.net-web-api exception-handling


    【解决方案1】:

    1- 确保在处理异常并将其吞没的管道中没有任何捕获。

    2- 如果您全局添加了过滤器,则不需要通过 HandleExceptionsAttribute 来装饰您的操作,因此请删除它并让您的代码生成异常并看看会发生什么,看看您的代码,我相信一切设置正确并且它应该工作。

    【讨论】:

    • 嗯,也许它不喜欢我同时拥有属性和全局过滤...也许是月相。不管它是什么,它现在似乎正在工作。谢谢!
    • 这是否意味着我不应该在我的代码中使用 try/catch?
    • 你应该只捕获你感兴趣的异常,不要只捕获“异常”类型而对该异常不做任何事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-26
    • 2016-06-05
    • 2014-02-25
    • 2011-05-09
    • 2015-02-08
    • 2011-03-27
    相关资源
    最近更新 更多