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

Masa / Lino Blog

Masanori Satoh ( Masa / Lino ) の徒然ブログです

検査例外と非検査例外(実行時例外)をどう使い分けるか

とある後輩が執拗に検査例外と非検査例外の使い分けについて聞いてくるので、久しぶりに真面目な話を書いてみます。


最初は一般的なJava言語的な解釈。


Effective Java的には次のようなベストプラクティスが書かれています。

40項: 回復可能な条件にはチェック済み例外を、プログラミング・エラーにはランタイム例外を使う。
Effective Java プログラミング言語ガイド

後者の「プログラミング・エラーにはランタイム例外を使う」っていう部分は、NullPointerExceptionとかの実行時例外は呼び出す側の頑張りで回避可能ということで非検査例外で処理するべきだよってことでしょう。


一方前者の「回復可能な条件にはチェック済み例外を」の部分ですが、回復可能な条件であればその通りだと思います。


ちなみにJava SEでは回復不可能でもSQLExceptionやFileNotFoundExceptionなどの検査例外は、呼び出す側の工夫だけでは回復不可能な例外も検査例外になっていると解釈しています。


従って、Java SE的に普通のライブラリなどを作成する場合は

呼び出し側の頑張りで回避可能 → 非検査例外
呼び出し側の頑張りでは回避不可能 → 検査例外

ってことでしょう。


ここまで、いろいろ書いてきましたが、フレームワークと組み合わせて使うなら、キチンと1箇所で例外ハンドリングをする前提で、基本非検査例外がいいと思っています。
エラーが発生したときに特殊な処理を行うときだけ検査例外にするのがいいかな。
じゃないとTry-Catch連発でコードも醜いし、ExceptionでCatchされそうです。
こちらの考え方に近いです。「ダイコン時代の設計手法 - 例外処理」


そもそも論ですが、例外の使い分けは人によって主張が違うし、これといった正解がないので派閥争いにつながりそうです。そもそも、検査例外がない言語もたくさんありますしね。


IBMDeveloper Worksにも記事が出ています。ここも参考になりました。
Javaの理論と実践: 例外をめぐる議論