ensure使い慣れん

例外処理でbeginとrescueを使っていたのですが、ensureを使いなれてないことがわかりました。ensureは例外の有無にかかわらずbegin式の最後に記述する処理を実行するもの。

今回は暗号処理をしたものには必ずresetメソッドを呼び出すために使いました。

def encrypt(file, pass)
  enc = OpenSSL::Cipher::AES256.new("CBC")
  enc.encrypt()
  enc.pkcs5_keyivgen(pass)
  begin
    File.open(file, "rb") do |fin|
      File.open("#{file}.sec", "wb") do |fout|
        while buff = fin.read(8000)
          fout.write(enc.update(buff))
        end
        fout.write(enc.final())
      end
    end
  ensure
    enc.reset()
  end
end

File.openでエラーが出た場合は、本文のほうで例外処理をしてあります。

    begin
      encrypt(arg, pass)
      puts("#{arg}を暗号化したファイル#{arg}.secを作成しました。")
    rescue
      puts("#{arg}の暗号化に失敗しました。")
    end