2

例外ハンドラについて質問があります。プロジェクトの構造化されたコードがあり、さまざまな目的のために多くのパッケージとクラスがあります。このコードでは、さまざまな種類の例外をキャッチしようとする場所がたくさんあります。それらのいくつかに言及するSAXExceptionIOException、、、、NumberFormatExceptionなどParserConfigurationExceptionですRuntimeException

例外をキャッチするすべての場合で、スタックトレースのみを出力します。例外に遭遇した瞬間、スタックトレースからそれが発生した関数を特定し、それに応じて修正します。コードサイズは大きくなく、デバッグもかなり簡単なので、例外を除いて他に何もしません。また、そうするつもりもありません。

現在、サードパーティの開発者が提供する外部Javaライブラリを使用しています。このライブラリは、私が呼び出す可能性のあるすべての関数に対して例外をスローします。このライブラリを利用するために、このライブラリのラッパーを作成しようとしています。ただし、このライブラリが原因で、コードのいたるところにtry/catchブロックがあります。

たとえば、私のコードは次のようになります-

Class Wrapper
{
     public void method1()
     { 
         ....
         try
         {
            ...
            third party library calls...
            ... 
         } catch (Exception e) { e.printStackTrace(); }

     }

     public void method2()
     { 
         ....
         try
         {
            ...
            third party library calls...
            ... 
         } catch (Exception e) { e.printStackTrace(); }

     }
     // ... and so on... there are 50-100 methods like this.
     // some are even one-liners.
}

このシナリオでは、この説明で説明したように、グローバル例外ハンドラーに切り替える必要がありますか?

これにより、コード内のいたるところにtry / catchブロックを書き込むことを回避できますか?

また、既存のtry / catchブロックを削除する必要がありますか?

ありがとう!

4

2 に答える 2

2

例外が発生した後にプログラムが終了してもかまわない場合は、おそらくグローバル例外ハンドラーを使用できます。throws Exception(未処理の例外のコンパイル時エラーを防ぐために) たくさんの場所に (またはより具体的な例外クラスを)配置する必要があるかもしれませんが、これは理想とはかけ離れています (そして、キャッチするよりも「きれいな」コードが少なくなる可能性があります)。それらがスローされる例外)。

一方、プログラムをエラーから回復させたい場合 (一般に、運用レベルのコードで必要になります)、適切に配置された try-catch ステートメントが必要になります (これには、コードのあらゆる場所に try-catch ステートメントを含める必要があります)。 )。

たとえば、IOException を受け取った場合は再試行したり、NumberFormatException を受け取った場合は、入力が無効であることをユーザーに通知して再試行させたりすることができます。

try-catch ステートメントを削除するだけではなく、その動作を確認し、この動作が目的のものであるかどうか、代替ソリューション (グローバルな try-catch ステートメントなど) で再現できるかどうかを確認する必要があります。

于 2013-02-07T16:17:26.673 に答える
2

クライアント コードでチェック例外を処理したくない場合は、ラッパーで次のようなことを行うことができます。

public void method1() {
     try {
        //3rd party code here....
     }
     catch(RuntimeException e){
         throw e;
     }
     catch(Exception e){
       throw new RuntimeException(e.getMessage(),e);
     }
}

IOExceptionこれにより、サードパーティのライブラリによってスローされた例外を飲み込むことが回避され、クライアントにSQLExceptionなどのChecked 例外の処理が強制されないことに注意してください。

于 2013-02-07T16:32:53.063 に答える