私は安らかなウェブサービスを書いていました。RESTful Web サービスのコントラクトは、パラメーターを受け取り、SSL を介して外部サービスと通信し、クライアントに応答することです。サービス契約およびサービスに問題はありません。サービスの設計は良好で、チェック済みの例外はすべて catch ブロックでキャッチされていましたが、いくつかのサービス テストの後、未チェックの例外が適切に処理されていないように見えました。ドメイン例外を使用して、これらの未チェックの例外をカプセル化する方法はありますか? 簡単にするために、チェックされていない例外を処理または予測する方法。
3 に答える
安らかなWebサービスの特定のケースでは、フレームワークには、望ましくないことを行う「キャッチオール」ハンドラーがあります。したがって、ここでの他のいくつかの回答とは対照的に、処理を追加したり、処理を変更したりすることは何も悪いことではありません。フレームワークのハンドラーは確かにあなたのためにクリーンアップするわけではないので、自分でクリーンアップすることによってのみ物事を改善することができます. したがって、2 つの選択肢があります。
JAX-RS 標準に従って、プロバイダーのリストに例外マッパーを追加できます。
コードを Throwable の try/catch でラップし、キャッチ ハンドラーでアピールする Response を作成できます。
JAX-RS に使用しているツールキットを知らなければ、(1) についてこれ以上詳しく説明することはできません。
コードには常に、すべての例外を処理する場所が 1 か所ある必要があります。チェックされた例外を宣言するメソッドが呼び出されるたびに、コードの処理が混乱しているように見えます。チェック例外が発生する下位レベルのコードでは、次のコードを使用します。
try {
...
catch (RuntimeException e) { throw e;}
catch (Exception e) { throw new RuntimeException(e); }
そして、例外バリア(言及された中央の場所)で使用
try {
...
catch (Throwable t) { // logging, returning error response, whatever
}
finally { // global resource cleanup
}
これ以上のことを行う必要があるのは、コード ベースではあまり一般的ではない特殊な場合のみです。これは、下位レベルのメソッドが各リクエストで既に取得したリソースに加えて追加のリソースを取得する場合です。例として、ファイル I/O があります。そのような場合、その余分なリソースを処理するために a を使用することはもちろん必須try-finally
ですが、それでも例外を飲み込んではいけませんcatch
。メインの例外バリアは、問題があったことを認識し、そのクリーンアップを行う必要があります。