あ、もう一つあった、ファイル操作に関連して例外処理を行っていた。
これに関しても言及しておこう。
ええと、Rubyの例外処理はtry/catchではない。紛らわしいったらありゃしない。
begin/rescueという構文。
これがほぼ、C++やJavaのtry/catchと一緒。
話が早いので引用してしまおう。
begin
yield
rescue Errno::EACCES
puts “#{file_name} が他のプログラムで書き込み禁止で開かれている可能性があります。” +
”ファイルを閉じてからエンターキーを押してください。”
while $stdin.gets
retry
end
end
ファイル操作するとこは、yieldで外からいろいろ与える想定ですが、
EACCESというタイプのファイルアクセスエラーが発生したら、
ファイルを閉じるなど操作をして、エンター押す。
と、retryで、beginからもう一度。
begin/recueでretryこの構文を理解するには分かりやすいと思う。
なんでこれを実装したかというと、
検証結果のファイルをExcelで使ってるまま、もう一回検証プログラムを流して、
ファイルに出力しようとして、エラーが出て異常終了。
例外処理が入ってないと、検証プログラムのそれまでの処理がムダになってしまう。
そんな苦い経験から、追加されたそうだ。
それ自体は分かるのだが、
とりあえず、検証結果はテンポラリファイルとして吐き出しといて、
既存のファイルの上書きとするかどうかは、OSのmoveコマンドでファイル操作したら、
という素朴な疑問が浮かび上がる。
復旧する可能性がある場合は、とりあえずテンポラリに吐いとけって、
その後なら安心して処理出来るじゃん。
RubyにはTempfileというクラスまで用意されている。
本書の処理では、
自力でファイルロックを解決できなければ無限ループで強制終了させるしかない。
それもちょっとな。
例外処理を用意しとくのは大事なこと。
ただ、もう一歩、よりセーフな処理を考えるとこまで進めたい。
質問コーナー、お問い合わせは、sanpome.net@gmail.com まで。