3

を使用して ServiceStack REST サービスを使用するクライアント アプリケーションでのエラー処理を簡素化しようとしていますJsonServiceClient

サーバーでスローしたカスタム例外はResponseStatusオブジェクトでシリアル化され、スローされていることがわかりますWebServiceException

しかし、現時点でWebServiceException ErrorCodeは、例外クラスの型名に一致させることにより、例外の型を確認する必要があります。(共有 DTO クラスで公開されます):

/** Current Method **/

try {

    client.Get(new RequestThatWillFail());

} catch(WebServiceException ex) {
    if(ex.ErrorCode == typeof(ValidationFailedException).Name)
        Console.WriteLine("Validation error");
    else if(ex.ErrorCode == typeof(UnauthorizedException).Name)
        Console.WriteLine("Not logged in");
    else if(ex.ErrorCode == typeof(ForbiddenException).Name)
        Console.WriteLine("You're not allowed to do that!");
    else
        throw; // Unexpected exception              
}

理想的には、既知の例外タイプJsonServiceClientに変換できるヘルパー メソッドまたはオーバーライド可能な変換関数が含まれることを望んでいました。WebServiceExceptionmytry ... catchをより伝統的な方法で使用できるようにするには、次のようにします。

/** Ideal Method **/

try {

    client.Get(new RequestThatWillFail());

} catch(ValidationFailedException ex) { // (WebServiceException is converted)
    Console.WriteLine("Validation error");
} catch(UnauthorizedException ex) {
    Console.WriteLine("Not logged in");
} catch(ForbiddenException ex) {
    Console.WriteLine("You're not allowed to do that!");
}

更新(明確化のため)

  • 例外が機能しており、デバッグして、必要なすべての情報を取得できます。
  • しかし、最終的には、一般的な WebServiceException の代わりに独自の例外をキャッチできるようにしたいと考えています
  • 例外で追加のプロパティを拡張するつもりはありません。最終的にはtypeof(MyException).Name == ex.ErrorCode、キャッチ内で多くのことを行う必要がないという便利さです。

JsonServiceClient次のマップを提供できると思います。

{ Type typeof(Exception), string ErrorCode }

つまり、次のようなもの

JsonServiceClient.MapExceptionToErrorCode = {
    { typeof(BadRequestException), "BadRequestException" },
    { typeof(ValidationFailedException), "ValidationFailedException" },
    { typeof(UnauthorizedException), "UnauthorizedException" },
    { typeof(AnotherException), "AnotherException" }
    // ...
}

サーバーが現在例外を Http ステータス コードにマップする方法と同様です。

次に、ThrowWebServiceException<TResponse>HandleResponseError<TResponse>内でをマップ内でJsonServiceClient検索し、一致する場合は、そのタイプの新しい Exception を返し、 をパラメーターとして渡すか、代わりにプロパティを変換します。ErrorCodeWebServiceException

しかし、より使いやすいエラーをスローするという最終的な目標があります。一致しなかった場合は、続けてWebServiceException.

と をオーバーライドThrowWebServiceException<TResponse>しますHandleResponseError<TResponse>が、これは可能ではないと思います。そして、この機能を提供するために独自のバージョンを作成したくありません。

これでOKだと説明できたと思います。

4

1 に答える 1