検査例外嫌いを表明するエントリ
寝る前にメモ書き。2010-09-29を見ていて思った。
Javaの方がひどいんじゃないか。
特殊な例を除いて型推論なんて存在しないし(あるだけマシ)、try catchで変数のスコープが無駄に広くなる点では同様。検査例外の関係でtry cathまたはthrowsを強制される。参照先で言うところのhoge.YYY();が検査例外を投げるので、catchでもtry catchしないといけない。(コードは記憶で書いているので適当です)。
FileInputStream fis = null; try { fis = new FileInputStream(file); fis.read(); } catch (IOException e) { if (fis != null) { try { fis.close(); } catch (IOException ignore) { // 何このどうしようもない状態 } } }
C#は検査例外じゃないから無視するという選択肢がある。例外はあくまで例外的に発生するものであって、データベースサーバが落ちているので発生する例外などは、どこかしらで処理しなきゃいけないけど、発生する例外の大半は事前の検査で回避できるものだと思う。
例外はなるべく回避できるようになっている。例えば、int.Parseは例外を投げるがint.TryParseであれば例外は投げない*1とか、キャストは例外を投げるが、asは例外を投げないとか。
本当に必要な場面以外ではtry catchを書かなくて済む。だから、そんなには気にならない。
なんて意見はダメかな……。
見返していて気づいたこと。closeはfinallyで書く。JavaはProject CoinのARMが待ち遠しい。C#のusingは良い。
追記。以下のようなコードの方が変数のスコープの問題(変数をnullで初期化している箇所やnullチェックしている箇所など)の観点からは良いようです。どちらにせよ、見やすいコードとは感じられませんが……。
try { FileInputStream fis = new FileInputStream(file); try { fis.read(); } catch (IOException e) { // FileInputStreamのread()の例外 try { fis.close(); } catch (IOException ignore) { // 何このどうしようもない状態 } } } catch (FileNotFoundException e) { // FileInputStreamコンストラクタの例外 }
*1:正直、bool Try*(out result)系のメソッドは好きじゃないけど……