読者です 読者をやめる 読者になる 読者になる

【訂正】例外を外に投げる 2

http://d.hatena.ne.jp/noire722/20100127/1264569986
結城先生の「リファクタリング入門」を読んで、
この記事で書いてたことが本質的に間違っていたと思ったので訂正します。

例外を外に伝搬しすぎるのもエラーが起こった場所がわかりづらくなって良くないですね。

例えば、

// 引数の値が0以上ならtrueを返すというメソッド
boolean method(int n){
    return n >= 0;
}

// 引数の値が負ならエラーとして処理
if(method(-1)){
   System.out.println("ERROR"); 
}

このコードはエラーを内部で処理してしまっていて利用者に伝わりにくいのと、
正常な処理と異常な処理の区別が付きにくくて良くないということ。


こういう時は
自分でExceptionのサブクラスを作って例外を投げちゃうのがいいんですね。
↓簡単な例

// 独自の例外クラス(名前は適当)
class InvalidNumberException extends Exception{
}

// 引数の値が0以上ならtrueを返すというメソッド
void method(int n) throws InvalidNumberException{
    return n >= 0 ? true : throw new InvalidNumberException();
}

// 処理実行
try{
    method(-1);
} catch(InvalidNumberException e){
    System.out.println("ERROR");
}

エラーを例外として処理する。勉強になりました。
こう見比べると、下の例の方が結構コードが長くなってしまっています。
リファクタリングにはメリットとデメリットがあるのでケースバイケースで利用しなさい、
と本の中で何度も念を押されていました。
クラスが増えるってだけでちょっと嫌ですしね。