独自例外

上のように書くとアレか、独自例外はちゃんと考えて作って欲しい、と読めてしまうな。
個人的には、独自例外はあまり定義したくない/して欲しくない派*1なんだけど、これは意見が分かれるのかも。


例外クラスってExceptionとかRuntimeExceptionを継承するだけでできちゃうから、

public class HogeException extends Exception {}

みたいに、中身が空でも作れてしまう。
独自例外を作り出すと、こんな中身のない例外クラスが量産されがちで、1クラス1ファイルが基本のJavaだとどんどんファイル数が増える。


こんな状況になるくらいなら、いっそJava標準の例外をばんばん使えばいいと思う。
基本的にIllegalArgumentException、IllegalStateException、NullPointerException、IOExceptionくらいあれば大体の例外的状況は表せるし、後はUnsupportedOperationExceptionを時々使うくらいで、とりあえずこのくらいの例外を覚えておけばそうそう困ることはないんじゃないだろうか?
で、自分の必要に応じてInterruptedExceptionとか他の例外を覚えればいいと思う。


ただ、上のエントリで書いた、「RuntimeException系列であって欲しいのにException系列な時」に生のRuntimeExceptionでラップしてもいいんだけど、これは是非意味を伝えたい。
この場合、IllegalArgumentExceptionやIllegalStateExceptionでラップするのがいいのかも知れないけど、元々はチェックされる例外だったんだ、って意味を伝えたい場合がある。
ということで、「RuntimeException系列であって欲しいのにException系列な時」は独自例外を使うことにしている。

public class NormallyCheckedException extends RuntimeException {

    public NormallyCheckedException(Throwable cause) {
        super(cause);
        if (cause instanceof RuntimeException)
            throw new IllegalArgumentException(cause);
    }

    public NormallyCheckedException(String message, Throwable cause) {
        super(message, cause);
        if (cause instanceof RuntimeException)
            throw new IllegalArgumentException(message, cause);
    }

}

問題はこの名前。多分「本来チェックされる例外」って意味で付けたんだろうけど、何かもっとぴったりな名前があるような気がしてならない。

*1:あくまでJavaに関して