Lazy Diary @ Hatena Blog

PowerShell / Java / miscellaneous things about software development, Tips & Gochas. CC BY-SA 4.0/Apache License 2.0

例外の区分

Java における「例外」と呼ばれるモノには、言語レベルで次のような区分が設けられている。

チェック例外
java.lang.Exception を継承し java.lang.RuntimeException を継承していない例外。
    • メソッド単位で言えば、引数に関係なく発生しうる例外が多い(気がする)。
    • catch するか、呼び出し元のメソッドに対して throw するように throws 句に書かなければならない。
    • 環境設定などに起因して発生する。
    • SQLException とか。
非チェック例外
java.lang.RuntimeException を継承した例外。
    • メソッド単位で言えば、引数に起因して発生する例外が多い(気がする)。
    • catch しなくてもいい。 catch すべきでないとする場合もある。
    • 明示的なエラー処理を行って発生を抑制し、もし発生したらプログラムロジックのバグである、というコードにするのが妥当だと思う。
    • IndexOutOfBoundException とか。
致命的エラー
java.lang.Error を継承した例外。
    • VM のエラーに起因するもので、もうどうしようもない。
    • catch できるが、多くの場合 catch すべきでない。
    • OutOfMemoryError とか。


で、実際には、チェック例外はさらに細かく分けられると思うんだけど、これを書いてあるものを見たことがない。

システムのユーザがどうにかできる例外
システムのエンドユーザが操作をし直せばユースケースの主系列を続行できる、という種類のエラー。
    • ユーザの指定した ID を主キーにして *1 DB に INSERT をかけたら主キーが被ってますよ、と SQLException が返ってきた。
    • ユーザが ID を指定しなおせば済む問題。
システムのユーザにはどうにもならない例外
システムのエンドユーザが操作をし直してもユースケースの主系列が続行できない、という種類のエラー。というかユースケースには普通書かない種類のエラー。
    • DB に接続しようとしたら例外が返りました、とか。
    • システム管理者が設定を見直さないとどうしようもない。
起こりえない例外
http://javafaq.jp/S018.html#S018-05 のようなもの。
    • リリースされたプログラムで発生するようであれば、プログラムのバグが原因。


「Core Java」でも「例外は Catch できる」「RuntimeException は文法上 Catch しなくてもよい」という文法上の話しかしてなかったような。

*1:これは本当はやるべきではなくて、一意な番号が自動的に振られる主キー + 入力した ID を保存する列、とすべき