2009-06-12 16 views
2

2つの異なる会社の2つのAPIを使用して、トランザクションを処理するためにサーバーと通信できるようにしています。私は、これらのAPIへの一般的なインターフェイスを作成することが任されています。私は、彼らが自分のリモートサーバーとのインタフェースに提供するAPIを使用していますCompanyAServiceProviderこのような状況の例外処理パターンはありますか?

IServiceProvider <- ServiceProvider <- CompanyAServiceProvider 
IServiceProvider <- ServiceProvider <- CompanyBServiceProvider 

:私はこのような何かを思い付きました。 A社のこのAPIは、B社とはまったく異なる例外をスローします。

私は例外をローカルで処理することができますが、実際にはその状況をスイートとはみなしません。

public String purchase(String amount) { 
    try { 
    request = new Request(RequestIF.NEW_ORDER_TRANSACTION); 
    } catch (InitializationException e) { 
    //do something. 
    } 
} 

それとも私が呼び出し側にこの例外をスローすることができます

public String purchase(String amount) throws Exception { 
    request = new Request(RequestIF.NEW_ORDER_TRANSACTION); 
} 

、呼び出し元がちょうどException関係なく、その例外ではありませんし、関係なく、それをスローどのAPIどんな扱いませんしましょう。

2つの異なる種類のスローされた例外を処理するときに、2つの異なるAPIにインターフェイスを書き込んで、汎用性を維持するにはどうすればよいですか。私はこれを正しく扱っていますか?何が最善の選択でしょうか?

答えて

14

この場合、私自身の例外サブクラスを作成し、実際の例外をラップするだけです。私のAPIは、私の例外を公開します。

+1

はい、独自のExceptionサブクラスを作成します。 ExceptionをパラメーターとするExceptionコンストラクターをサポートしていることを確認してください。 APIは、このAPIのユーザーにとって意味のある名前の例外を作成することができ、使用しているサードパーティAPIから入ってくる例外を適切にラップすることができます。これはベストプラクティスです。 – Eddie

+0

購入メトール内で、A社のAPIから複数の異なる例外をスローすることはできますか?自分が作成した別の例外クラスでそれぞれをラップしますか? –

+2

元の例外のセマンティクスを提供したい場合は、オリジナルのカスタム例外に基づいて複数の例外クラスを作成することができます。MyException、Failure1ExceptionはMyExceptionなどを拡張します。次に、メソッドに対してMyExceptionを宣言するか、Failure1Exception、Failure2Exceptionなどをリストします。 – akarnokd

3

呼び出し関数のレベルでどの程度抽象化しているかを考えてみましょう。おそらくあなたはあなたが扱っている個々の企業の詳細を公開したくなく、Orders、PurchaceTransactionsなどのより一般的な概念を扱うことを好むでしょう。 前のポスターのアドバイスは良いです:PurchaseExceptionのようなクラスを作成してくださいベンダーの個々の例外クラスから得た情報を包むラッパー。

1

ローカルExceptionを処理し、(必要なとき)下流スローするようにあなた自身をロールバックするもう一つの理由:

仕事があるかもしれません(クリーンアップ、再試行、など)する際の具体的な種類に実行する必要がありますベンダーによって異なるExceptionがスローされます。

関連する問題