Manipulador de exceção

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

Um bloco begin...end pode deslocar uma seção de código. É usado normalmente para manipular exceções.

begin
  puts "um begin/end básico sozinho não é muito útil'
end
begin
  puts "no entanto, quando usado com um rescue, resulta  em manipulação de exceção"
  raise Exception.new("minha exceção")
rescue Exception => e
  puts e.backtrace
end

Um bloco begin...end pode estar sozinho, com um ou mais blocos de resgate e/ou com um bloco de proteção.

begin
  puts "os blocos de proteção são úteis para limpar recursos apesar dos erros que possam ocorrer"
  f = File.open("meuarquivo")
  raise Exception.new
rescue NameError => n
  # nenhum NameError é criado, de modo que não chegaremos aqui
ensure
  # mas sempre chegaremos aqui, a não ser que o intérprete ou o segmento se feche
  f.close
end

Observe que o escopo padrão do Ruby para variáveis locais também é válido para blocos begin...end: há somente um escopo em um dado método (sem contar as variáveis com bloco com escopo).

A forma anônima de resgate intercepta somente as exceções que vêm de StandardError, como se segue:

begin
  eval "\"" # cria um SyntaxError
rescue => e
  # O SyntaxError não será interceptado
end

Compare com:

begin
  raise NameError.new("Nome de algum erro")
rescue => e
  # O NameError será interceptado
end