A begin...end block can offset a section of code. It is typically used for exception handling.
begin puts "a bare begin/end alone isn't terribly useful' end
begin
puts "however when used with a rescue, exception handling results"
raise Exception.new("my exception")
rescue Exception => e
puts e.backtrace
end
A begin...end block can stand alone, with one or more rescue blocks, and/or with an ensure block.
begin
puts "ensure blocks are useful for cleaning up resources regardless of errors that may occur"
f = File.open("myfile")
raise Exception.new
rescue NameError => n
# no NameError raised, so we'll not get here
ensure
# but we'll always get here, unless the interpreter or thread terminates
f.close
end
Note that Ruby's standard scoping for local variables holds for begin...end blocks as well: there is only one scope in a given method (not counting block-scoped variables).
The anonymous form of rescue only catches exceptions that descend from StandardError, as follows:
begin eval "\"" # raises a SyntaxError rescue => e # The SyntaxError will not be caught end
Compare to:
begin
raise NameError.new("Some name error")
rescue => e
# The NameError will be caught
end