ExceptionとRuntimeExceptionの違い

ExceptionとRuntimeExceptionの違いはプログラミングの段階で発生が予見されるかされないか、例外処理が必須か必須でにないかの違いというぐらいに考えていました。


でも、最近気づいたんですがこの違いは「準正常系」か「異常系」かという風にとらえるべきじゃないかと。


たとえば、IOExceptionはファイル処理に異常が発生した時に発生するExceptionですが、これが起きたらだいたい準正常系処理に流れます。
「ファイルがありません」とか「ディスクが存在しません」とかのメッセージを出したりとかですね。


逆に、NullPointerExceptionなどのRuntimeExceptionが発生したら特に決まった処理をするというよりも、異常系処理に流れます。
放置してプログラムを止めるわけにはいかないので、大体はシステム上部で捕まえて「エラーが発生しました」「失敗しました。時間をおいてやり直してください」とかの異常時メッセージを出すと思います。


むろん、RuntimeExceptionだけど準正常系処理にもっていくなんて場合もあると思います。
たとえば、ユーザが入力したものが数値かチェックするのにInteger.parseIntを使う場合です。
この時発生するNumberFormatExceptionはRuntimeExceptionですが、準正常系処理として使うならtry〜catchすればOK。
メソッドの外に投げるなら、Exception系でラップすれば呼び元に処理を委譲できます。

try{
	Integer.parseInt(str);
}catch(NumberFormatException e){
	throw new Exception(e);
}

(もう少し気の利いたExceptionを投げるべきですが・・・(汗))


こんな考えで最近はプログラム組んでます。
これだと、正常系処理と準正常系・異常系をきれいに分離できるのが大きなメリットだと思います。
我流な考えであってるか分からないですが・・・。


(今経験中のお客さんだと、積極的にExceptionは潰して戻り値で処理を変えるやり方を用いているので、なおのことあってるかわからないです。経験不足・・・)