2014-09-27 275 views
0

我试图抛出一些异常,将其捕获到HandleException属性中,并将其正确返回给客户端。基于异常类型处理异常/ HTTP状态代码

下面是一个例子:

[HandleException(Type = typeof(UserNotFoundException), Status = HttpStatusCode.NotFound)] 
[HandleException(Type = typeof(LoginFailedException), Status = HttpStatusCode.Unauthorized)] 
public UserProfile Login(UserCredentials userCred) 

在我Login()功能,我不是抛出一个UserNotFoundExceptionLoginFailedException

HandleExceptionAttribute看起来是这样的:

public class HandleExceptionAttribute : ExceptionFilterAttribute 
{ 
    public Type Type { get; set; } 
    public HttpStatusCode Status { get; set; } 

    public override void OnException(HttpActionExecutedContext context) 
    { 
     var ex = context.Exception; 

     ResponseHelper.CreateException(Status, ex.Message); 
    } 
} 

我要的是能够处理将要抛出什么样的异常,并在属性,在这里我指定的HttpStatusCode妥善处理。

使用此代码的问题是始终调用最顶层的属性。所以即使例外是LoginFailedException我总是会得到UserNotFoundException和404代码返回给客户端。

我该如何做到这一点?

回答

1

就在我头顶,看起来您需要在您的OnException方法中进行一些筛选,以便验证您获得的异常是否与您希望该属性实例的异常匹配处理。

public override void OnException(HttpActionExecutedContext context) 
{ 
    var ex = context.Exception; 
    if(typeof(ex) == Type)   
     ResponseHelper.CreateException(Status, ex.Message); 
} 
+0

太棒了,非常感谢你! – Gaui 2014-09-27 22:26:26