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