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