Ruby: えっと・・・これはネタですか?

(何を言いたいか分からないエントリだったので、少し整理して、追記しました)
http://www.rubyist.net/~matz/20070820.html#p02
そういう風に書かせないために、チェック例外があるのでしょうがorz
例外はむしろチェックされない例外があることのほうが問題。(参考→[id:lethevert:20070817:p1])

      • -

Rubyのコードもそうだけれど、元の記事のJavaのプログラムも、プログラムが下手すぎ。これで十分。

String readData(File file, String default_value) {
  BufferedReader in = null;
  try {
    in = new BufferedReader(new FileReader(file));
    return in.readLine();
  }catch(IOException e) {
    return default_value;
  }finally{
    try{ in.close();}catch(Throwable _){}
  }
}
      • -

close()で全部例外をつぶしているのは、本文から投げられた例外を隠さないためで、RuntimeExceptionだろうがErrorだろうが全部catchして無視する意図です。close()で何が起きても、その後の処理に影響があることはまずないという判断です。なにも記録が残らないのが気になるなら、

    try{ in.close();}catch(Throwable e){ log.warn(e);}

としておけばいいかと。

      • -

元のRubyのコードが何がorzかというと、

def read_data(file)
  begin
    file.readline
  ensure
    file.close
  end
end

Javaで書き直せば、

String read_data (BufferedReader file) throws Throwable {
  try{
    return file.readLine();
  }finally{
    file.close();
  }
}

と書いているのと同じですよね。

  1. read_dataから例外が洩れるのは意図的なの?
  2. closeで例外が出たらreadlineの例外を隠すんじゃないの?
  3. チェック例外じゃないことで、例外の問題に気づかずにスルーしてしまう危険はないの?
  4. IOエラーって単体テストで必ずチェックしているものなの?
  5. どこで例外が発生するか分からないプログラムを書くのって恐くないの?

それから、これも気になった。

  1. オープンしたファイルをわたすの?(Rubyはファイルオブジェクトを作ったらデフォルトでファイルをオープンするの?)