2017-04-17 19 views
5

この2つのトピックについては非常に不明です。同じように処理する必要のある例外に対しては、マルチキャッチを使用する必要があることはわかっています。しかし、どのような目的のために私は本当にそのようなものが必要です。マルチキャッチを使用するタイミングと再使用するタイミングを教えてください。

private void something(String name) throws IOException, RemoteException { 
    try { 
     ... 
    } catch (Exception ex) { 

     ... // do something 

     throw ex; 
    } 
} 
+1

ただし、一般的な例外を使用するのは悪い習慣です。 [ここ](http://stackoverflow.com/questions/2416316/why-is-the-catchexception-almost-always-a-bad-idea)を参照してください。 – Enzokie

+0

この質問は不明瞭で意見に基づいていませんか? –

答えて

3
あなたがその実行中にスローされた例外は同じ方法で処理しなければならない。この方法のために考慮して、クライアント

に例外を伝播させる前に、タスクを実行したい場合は、それを行うことができます

たとえば、情報のロギングなど例外が発生したときに特定の処理を実行するとします。だからあなたはこの仕事をするためにそれを捕まえる。
しかし、キャッチされた例外は問題であり、それを記録することは例外の「本当の」処理ではないと考えています。だから、あなたはそれを再スローすることによって伝播させます。

+0

ありがとう、ありがとう。しかし、私はもう1つ質問してもいいですか?キャッチによってNullPointerExceptionがスローされ、キャッチされると仮定しましょう。 throws節にIOとRemoteExceptionだけが記述されているので、この例外も呼び出しメソッドにスローされますか?ご挨拶はドイツ – LaBlum

+0

ようこそ。非常に興味深い質問です。 'NullPointerException'は' RuntimeException'です。この種の例外は、メソッド宣言で明示的に宣言する必要はありません。あなたはそれをキャッチすることなく、またはそれを投げていると宣言することなくそれを投げることができます。チェック例外である 'IOException'や' RemoteException'とは異なります。これらの最後は 'Exception'からのみ得られ、' RuntimeException'からは派生しません。 – davidxxx

+0

それは本当です...私はそれを考慮しませんでした。また、int型変数にStringを格納したかったので、IllegalArgumentExceptionがスローされた場合はどうなりますか? throws節で言及されていませんが、それは呼び出しメソッドにとにかくスローされますか? – LaBlum

3

再スロー

あなたが例外について、呼び出し元メソッドを通知したいときはいつでも、あなたがキャッチして再スロー例外。

何らかのメソッドcallSomething()があなたのメソッドsomething()を呼び出しているとします。 something()の内部で何らかの例外が発生した場合、例外をキャッチするだけでアプリケーションは失敗せず、callSomething()メソッドに再スローされます。 callSomething()は内部エラーについてクライアントに通知します。

他の例は、MVCパターンでは、クライアントによって要求された要求が、要求マッピングに基づいてコントローラからの何らかの方法によって提供されます。コントローラはサービスを呼び出し、サービスはdaoの何らかの方法とやりとりします。 DAOで何らかの例外が発生すると、DAOはサービスの例外を元に戻し、サービスはコントローラに再投入され、エラーメッセージについてクライアントに通知するのはコントローラです。 これはとして知られています。例外伝播はjavaです。 例外がメソッドからメソッドに伝播し、呼び出しスタックが捕捉されるまで

マルチキャッチ

あなたは例外の複数のタイプのために同じアクションを実行したい場合は、あなたがマルチキャッチを使用しています。

2

あなたは例外がメソッドを去るせる前に、前処理のものにしたい

  1. 次のような状況で再スローが必要になります。ただし、例外の種類を気にしない場合は、finallyブロックでも前処理を実行できます。
  2. チェックされている例外を未チェックの例外に変換しようとしています。その場合は、すべての例外をcatch(Exception ex)としてキャッチし、それらをthrow new RuntimeException(ex)として再スローします。
  3. カスタム例外をビルドされた例外の代わりにスローする必要があります。だからあなたはすべての例外をキャッチし、好ましくは未チェックの独自の例外オブジェクトを作成してそれをスローします。多くのAPIがこれを行います。たとえば、Springでは直感的ではないJDBC例外をSpringのカスタム例外に変換します。
  4. これは前処理のようなものです。 ArrayListなどを作成することによってスローされたすべての例外を追跡したいので、複数のステップを持つプログラムの最後に例外をスローするステップが分かるようにします。私はこれがTalendで生成されたJavaコードで使用されているのを見ました。
関連する問題