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