【问题标题】:ExceptionFilter OnException not being calledExceptionFilter OnException 未被调用
【发布时间】:2017-12-14 20:32:44
【问题描述】:

我是使用异常过滤器的新手。

点击链接:https://docs.microsoft.com/en-us/aspnet/web-api/overview/error-handling/exception-handling#httpresponserexception

我已经创建了一个类

public class NotImplExceptionFilterAttribute : ExceptionFilterAttribute
{
    public override void OnException(HttpActionExecutedContext context)
    {
        if (context.Exception is NotImplementedException)
        {
            context.Response = new HttpResponseMessage(HttpStatusCode.NotImplemented);
        }
    }
}

然后我在控制器上的单个方法上使用了该属性。我还没有全局添加过滤器,因为我现在希望它在单一方法上工作。

public class HomeController : Controller
{
    [NotImplExceptionFilter]
    public void Test()
    {
        throw new NotImplementedException("This method is not implemented");
    }
}

但是每次我抛出错误时都不会调用 OnExepction。请让我知道我错过了什么

【问题讨论】:

    标签: c# asp.net-mvc exception-handling


    【解决方案1】:

    我认为您的问题是您从 Controller 类继承而不是 ApiController 如文档所述。

    由于您在此属性中使用 System.Web.Http 命名空间,因此它仅适用于 Api 控制器。

    如果您还想使用其他控制器,则需要添加另一个异常过滤器属性,但在这种情况下不要使用System.Web.Http,而是使用System.Web.Mvc 命名空间,其他部分的代码几乎相同(仅一些小改动)

    再次覆盖OnException 并在其中创建您的逻辑,但请记住这两种方式在您实际向用户显示错误消息的方式上是不同的。第一个使用响应来显示消息,另一个必须以不同的方式实现。大概看看这个here

    【讨论】:

    • 不能。因为我的控制器上有一些使用视图的操作,如果我使用 apicontroller,它会出错。异常处理是否仅适用于 ApiController?
    • 在这种情况下,它仅适用于 fot api 控制器,因为您当前正在使用 System.Web.Http 命名空间。
    • 嗯,但是有没有办法让我在 Controller 上而不是在 ApiController 上使用错误处理?
    • @HVT_08 查看编辑。最后,有一种方法可以向用户显示错误消息。您可以自定义执行此操作的方式,但总体思路保持不变
    • 很高兴它有帮助?
    【解决方案2】:

    您的另一个问题是您缺少 System.Web.Mvc.FilterAttribute,一旦应用它,它应该会按预期触发。 (前提是您更改了使用 IExceptionFilter/ExceptionContext 而不是 ExceptionFilterAttribute/HttpActionExecutedContext ,如前所述。

    例子:

    [AttributeUsage(AttributeTargets.Method]
        public class NotImplExceptionFilterAttribute : FilterAttribute, IExceptionFilter
        {
            public void OnException(ExceptionContext filterContext) {
            {
                if (filterContext.Exception is NotImplementedException)
            {
                filterContext.Response = new HttpResponseMessage(HttpStatusCode.NotImplemented);
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-02-14
      • 2014-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多