Exceptionを複数の呼び出し元のメソッドでcatchする方法

例外(Exception)を投げて(throw)それをcatchして処理を加えたい、という場面は多くあります。しかし、開発経験の浅い自分などでは、複数のメソッドを呼び出している場合にどうコードを書けば良いのか分かりませんでした。

今回その方法を教えていただいたので、紹介したいと思います。


以上の文章ではいまいち困るポイントがわからないと思うので詳しく書きます。 例として、メソッドAからメソッドBを呼び出し、メソッドBからメソッドCを呼び出すという、3層の処理を行う構造を考えます。


メソッドA(ここでException1をcatchしたい)

↓ 呼び出し

メソッドB(ここでException1を含む、全ての例外をcatchする記述がある)・・・ここで目的の例外がcatchされてしまう!

↓ 呼び出し

メソッドC(Exception1を含む、複数の種類の例外(Exception2, Exception3…)が発生する)


具体的には、メソッドBにはすべての例外をcatchしてしまう catch (Exception e) が記述されていると考えて下さい。

一番下の階層、メソッドCでException1が発生したとします。catchしたい場所はメソッドAです。

ところが、メソッドC内でcatchしないとException1はcatch文をさがして上層のメソッドBに干渉します。メソッドBでは全ての例外をcatchしてしまうため、単純に行くとメソッドAでException1をcatchすることは出来ません。

そんなときは、メソッドB内でException1をcatchする文を書き、処理内容でもう一度Exception1を投げてやります。具体的には、メソッドB内で

    } catch (Exception1 e) {    //Exception1のみをcatchする文
      throw e;                    //ここでもう一度例外Exception1を投げる
      logger.error("fileupload", e);  //もともとメソッドBで処理させていた例外処理
    } catch (Exception e) {    //なにも手を加えないとここでcatchされてしまう
      logger.error("fileupload", e);  //もともとメソッドBで処理させていた例外処理
    }

という例外処理にしてやります。こうすることで、メソッドCで発生した例外を、メソッドBの例外処理をこわすことなくメソッドAに伝えることができます。

いろいろな場面で役立つのではないでしょうか。以上です。