使用新的自定义预期覆盖抛出的异常

时间:2017-02-15 11:39:15

标签: c# rest exception exception-handling

我试图覆盖从我的服务调用抛出的异常,到我自己的自定义异常。我有两个我想要使用的自定义异常,具体取决于从服务调用返回的StatusCode。可以是500+的ServerException,也可以是400+错误的ClientException。

catch (ApiException e)
{
    if ((int)e.StatusCode >= 400 && (int)e.StatusCode < 500)
    {
        throw new ClientException(e.StatusCode.ToString(), e.Message, e.Uri.ToString(), e.HttpMethod, e.Content, e.StatusCode, e.InnerException.Message);
    }
    else
    {
        throw new ServerException(e.StatusCode.ToString(), e.Message, e.Uri.ToString(), e.HttpMethod, e.Content, e.StatusCode, e.InnerException.Message);
    }
}

我需要覆盖示例中捕获的ApiException。由于某种原因,该示例返回一个Exception对象,其中ApiException作为内部异常。不会返回客户端或服务器异常。

对服务的调用:

catch(ClientException e)
 {}
catch(ServerException e)
 {}
catch (ApiException e)
 {}
catch (Exception e)
 {
  //Always caught here only
 }

ClientException类,为了便于阅读而缩短:

public class ClientException : Exception
{
    public string Code { get; private set; }
    public string ReasonPhrase { get; private set; }
    public ClientException(string code, string message) : base(message)
    {
        Code = code;
        ReasonPhrase = message;
    }
 }

2 个答案:

答案 0 :(得分:1)

我认为您的代码会抛出类似

的ApiException
resourceManager=nn1:8032,nn2:8032,yarnrm

并在您的代码中

public void  foo(){
....
throe new ApiException();
}

你可以使用ExceptionLocator来定位自定义异常或者在Foo()中决定抛出ClientException或ServerException

答案 1 :(得分:0)

您没有定义接受参数的方法

throw new ClientException(
    e.StatusCode.ToString(),
    e.Message, 
    e.Uri.ToString(), 
    e.HttpMethod, 
    e.Content, 
    e.StatusCode, 
    e.InnerException.Message);

您需要班级中的方法,例如

public ClientException(
    string StatusCode,
    string Message, 
    string Uri 
    string HttpMethod, 
    string Content, 
    string StatusCode, 
    string InnerExceptionMessage) : base(...)
{
    ...
}

或者,您可以使用

public ClientException(params object[] args)
        : base(...) { }