ASP.NET Web API中是否有任何方法可以将异常标记为ExceptionFilterAttribute中的处理?
我想在方法级别使用异常过滤器处理异常,并停止传播到全局注册的异常过滤器。
控制器操作上使用的过滤器:
public class MethodExceptionFilterAttribute : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext context)
{
if (context.Exception is NotImplementedException)
{
context.Response = new HttpResponseMessage(HttpStatusCode.InternalServerError)
{
Content = new StringContent(context.Exception.Message)
};
// here in MVC you could set context.ExceptionHandled = true;
}
}
}
全球注册过滤器:
public class GlobalExceptionFilterAttribute : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext context)
{
if (context.Exception is SomeOtherException)
{
context.Response = new HttpResponseMessage(HttpStatusCode.SomethingElse)
{
Content = new StringContent(context.Exception.Message)
};
}
}
}
答案 0 :(得分:2)
尝试在本地处理结束时抛出HttpResponseException。按照设计,它们不会被异常过滤器捕获。
throw new HttpResponseException(context.Response);
答案 1 :(得分:0)
Web API 2在设计时考虑了inversion of control。您认为可能已经处理了异常,而不是在处理之后中断过滤器的执行。
从这个意义上说,从ExceptionFilterAttribute
派生的属性应该检查异常是否已经处理,因为is
运算符对null
的值返回false,因此代码已经执行了该操作。另外,在处理异常之后,请将context.Exception
设置为null
,以避免进一步处理。
要在代码中实现此目的,您需要将MethodExceptionFilterAttribute
中的注释替换为context.Exception = null
,以清除异常。
需要注意的是,由于顺序问题,注册多个全局异常过滤器不是一个好主意。有关Web API中属性过滤器的执行顺序的信息,请参见以下线程Order of execution with multiple filters in web api。