今日の役に立たない一言 - Today’s Trifle! -

古い記事ではさまざまなテーマを書いていますが、2007年以降はプログラミング関連の話がほとんどです。

Java TIPS - 例外処理

以前、Java の例外処理をどのようにコードにするか頭を悩ませたことがあった。昔書いたコードを見て、苦労していたのを思い出したので、ひとつの解決策を紹介する。
一般にたくさんの例外が発生する場合、あちこちのサンプルコードでは以下のように書かれている。

    public void someMethod() {
        try {
            :
        } catch (IOException ioe) {
            :
        } catch (NullPointerException npe) {
            :
        } catch (IllegalArgumentException iae) {
            :
        } catch (Exception e) {
            :
        }
    }

それぞれの例外処理が長ったらしくてメソッドがやたら長くなり可読性が低下する。
最初は、これを以下のように書き直す案を考えた。

    public void someMethod() {
        try {
            :
        } catch (Exception e) {
            processExceptions(e);
        }
    }

    void processExceptions(Exception e) {
        if (e instanceof IOException) {
            :
        } else if (e instanceof NullPointerException) {
            :
        } else if (e instanceof IllegalArgumentException) {
            :
        } else {
            :  // その他の例外
        }
    }

でも、このコードは catch ブロック内で多くの処理を行うことになり、気分的にあまり気に入らなかった。ローカル変数に一時的に保持してやるようにした。

    public void someMethod() {
        Exception exception = null;
        try {
            :
        } catch (Exception e) {
            exception = e;
        }
        if (exception != null) {
            processExceptions(exception);
        }
    }

こうしとけば、processExceptions() 内で好きなように例外を処理できる。また、適当な例外を自分でインスタンス化することで、例外処理部分だけを対象にしたテストが可能になる。