検査例外・非検査例外

http://d.hatena.ne.jp/kmaebashi/20100114/p1, http://b.hatena.ne.jp/entry/http://d.hatena.ne.jp/Nagise/20100116/1263630204の検査例外は重要だけどJavaの検査例外は面倒という話。

文脈が大事。

たとえば、

  • ユーザ入力の文字列を数値へ変換する。
  • 設定ファイルの文字列を数値へ変換する。

とでは少々扱いが異なる。前者は検査例外を使うべきだろうし、後者は検査例外を使わなくてもよいかもしれない。
その場所で投げられる例外に検査が必要か否かは文脈に大きく依存する。Javaの検査例外が使いにくいのは、文脈に依存した分類ができないから、という面が大きいのではないだろうか。
本来、検査が必要か否かは型から独立して扱うことができるはずだ。lintなどの静的解析ツールではtainted/untaintedという属性を用いてこのような文脈を識別している。

〆。

JavaのAnnotationはこのような文脈識別用途にも利用されている(JSR-305, JSR-308など)が、ライブラリとツールの対応が十分ではなく解析できるはずのものができていない例も多い。これもその一つなのではないかと思う。