Ausnahmebehandlung

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

Ein "begin...end"-Block kann einen Codebereich abgrenzen. Typischerweise wird damit die Fehlerbehandlung durchgeführt.

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

Ein "begin...end"-Block kann alleine mit einem oder mehreren "rescue"-Blöcken und/oder einem "ensure"-Block stehen.

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

Hinweis: Die Sichtbarkeit lokaler Variablen in Ruby bezieht auch die "begin...end"-Blöcke mit ein. Es gibt nur eine Sichtbarkeit innerhalb einer Methode (Variablen mit Blocksichtbarkeit aussen vorgelassen).

Die anonyme Form von "rescue" fängt nur Ausnahmen ab, die von StandardError abstammen:

begin
  eval "\"" # raises a SyntaxError
rescue => e
  # The SyntaxError will not be caught
end

Vergleich mit:

begin
  raise NameError.new("Some name error")
rescue => e
  # The NameError will be caught
end