2017-02-15 8 views
0

私のサービスコールからスローされた例外を、自分のカスタム例外にオーバーライドしようとしています。私はサービスコールから返されたStatusCodeに応じて、使いたい2つのカスタム例外を持っています。 500以上のServerExceptionまたは400以上のエラーのClientExceptionです。新しいカスタムexpectionでスローされた例外をオーバーライドします。

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を無効にする必要があります。何らかの理由で、この例では内部例外としてApiExceptionを持つExceptionオブジェクトが返されます。クライアントまたはサーバーの例外を返しません。

サービスへの呼び出し:

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; 
    } 
} 
+0

非同期のカプセル化方法はありませんか? –

+0

サービスコールにrefitを使用しているため、サービスコール自体は非同期ですが、コールを保持するメソッドではありません。 – cfl

+0

実際に例外をキャッチしていますか? – FINDarkside

答えて

1

を使用することができます私はあなたのコードが

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

ようにApiExceptionをスローし、あなたのコードで、あなたがExceptionLocatorを使用することができます

try 
{ 
    foo();//throe ApiException 
} 
catch(ClientException e) 
{} 
catch(ServerException e) 
{} 
catch (ApiException e) 
{ 
    var ex=ExceptionLocator.Get(ExceptionCode);//use ExceptionLocator to locate your custom exception 
    throw ex; 
} 
catch (Exception e) 
{ 
    //Always caught here only 
} 

public abstract class BusinessException : 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; 
    } 
} 

public class ClientException:BusinessException 
{ 

} 

public class ServerException:BusinessException 
{ 

} 

public static class ExceptionLocator{ 
    static Dictionary<int,BusinessException> locator=new Dictionary<int,BusinessException>(); 

    public ExceptionLocator() 
    { 
     locator.Add(400,new ClientException()); 
     locator.Add(500,new ServerException()); 
     .... 
    } 
    public static BusinessException Get(int code) 
    { 
     return locator[code]; 
    } 
} 

を持っていると思いますあなたのカスタム例外を見つけるか、Foo()でthrowするかどうかを決定するClientExceptionまたはServ erException

+0

ExceptionLocatorにはどのライブラリを使用しましたか?ありがとう – cfl

+1

@cfl私の答えを更新する –

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(...) { } 
関連する問題