例外処理

begin...rescue...ensure...end

begin...end ブロックでは、コードのセクションをオフセットできます。通常は例外処理に使われます。

begin puts "begin/end だけではそれほど便利ではありません' end
begin
  puts "ただし rescue と一緒に使うと例外処理ができます"
  raise Exception.new("my exception")
rescue Exception => e
  puts e.backtrace
end

begin...end ブロックは、単独で使うことも、1 つまたは複数の rescue ブロック、または ensure ブロック (あるいはその両ブロック) と一緒に使うこともできます。

begin
  puts "ensure ブロックはエラー発生の可能性を気にすることなくリソースを整理するのに便利です"
  f = File.open("myfile")
  raise Exception.new
rescue NameError => n
  # NameError は発生しないので、ここは実行されません
ensure
  # ただしインタープリタかスレッドが終了しない限り、ここは必ず実行されます
  f.close
end

Ruby の局所変数の標準的な有効範囲は、begin...end ブロックでも保持されます: つまり、ブロックを有効範囲とする変数は除き、既定のメソッドには 1 つの有効範囲しかありません。

rescue の匿名形式では、次のような StandardError のみキャッチします。

begin
  eval "\"" # SyntaxError が発生
rescue => e
  # SyntaxError はキャッチされない
end

次と比較してください。

begin
  raise NameError.new("Some name error")
rescue => e
  # NameError はキャッチされる
end