2

Web サービスでの優れた例外処理戦略についてアドバイスが必要です。

私の Web サービス メソッドは、Oracle データベースに対して標準の CRUD 操作を実行しています。したがって、データを選択してデータセットを返すメソッドと、挿入/更新/または削除を実行して何も返さないメソッドがいくつかあります。

最初は、try-catch-finally で Oracle の例外をキャッチする各 Web サービス メソッドにすべてのコードがありました。これは良くないという Web 上の記事を読みました。例外の可能性がある場合にのみ、try-catch で囲む必要があります。今は、Insert/Update/Delete メソッドだけを try-catch-finally ブロックに入れるのが一番いいのではないかと考えています。

だから私の質問は:

  1. すべてのメソッドを try-catch-finally に入れる必要がありますか? それらはすべて Oracle と対話し、潜在的に例外を引き起こす可能性があります。それとも、Insert/Update および Delete メソッドに対してのみこれを行う必要がありますか?

  2. 例外が発生したときに何をしたいのかについて、私は実際には何の要件もありません。私は常識に従っているだけです。彼らがアプリを終了させたくないのは明らかです。何らかの方法で例外をログに記録し、クライアントに再スローすることを計画しています。Oracle 例外が発生したときにこれを行っています。

4

2 に答える 2

2

基本的に、すべてで try-catch を実行する必要がありますWebMethod。イベントが泡立たないので、他に良い方法はないと思います。

ただし、この投稿のトリックを使用して、生活を楽にすることができます。

彼のやり方は、このようなユーティリティ メソッドを作成し、Web メソッド ロジックにデリゲートを渡してそのメソッドを呼び出すことです。

private T Execute<T>(Func<T> body)
{
    //wrap everything in common try/catch
    try
    {
        return body();
    }
    catch (SoapException)
    {
        //rethrow any pre-generated SOAP faults
        throw;
    }
    catch (ValidationException ex)
    {
        //validation error caused by client
        ClientError innerError = new ClientError();
        //TODO: populate client error as needed
        //throw SOAP fault
        throw this.GenerateSoapException(
            "An error occurred while validating the client request.",
            SoapException.ClientFaultCode,
            innerError);
    }
    catch (Exception ex)
    {
        //everything else is treated as an error caused by server
        ServerError innerError = new ServerError();
        //TODO: populate server error as needed
        //TODO: log error
        //throw SOAP fault
        throw this.GenerateSoapException(
            "An unexpected error occurred on the server.",
            SoapException.ServerFaultCode,
            innerError);
    }
}
于 2013-09-06T05:13:07.823 に答える
1

ASP.NET WebMethods を使用していると仮定します。私のアドバイスは、常にサービス層で例外をキャッチし、ログを書き、SoapException をスローすることです。基本的に各サービスメソッド(WebMethod)でtry-catchできます。そうしないと、サービスを呼び出しているクライアントに例外の詳細が公開され、セキュリティ上の問題が発生する可能性があります。

于 2013-06-26T20:11:09.303 に答える