Exceções
Exceções são uma forma eficiente e "limpa" de tratar erros e outras situações previstas e imprevistas em um programa.
Ruby (assim como outras linguagens OO), usa objetos para representar
exceções. Tais objetos são da classe Exception, e têm uma
String com uma mensagem de erro, e informações sobre o estado da
pilha (stack traceback).
Para causar uma exceção é usado o método raise (ou
fail), da classe Kernel. raise pode ter
as seguintes formas:
raise raise mensagem_ou_exceção raise tipo_de_erro, mensagem raise tipo_de_erro, mensagem, traceback
Para responder a uma exceção, é usado o comando rescue em uma
expressão begin ou método. O comando else pode ser
usado para executar um bloco quando rescue não for acionado.
ensure pode ser usado para definir um bloco que será executado
sempre.
def espera_regexp(re)
linha = readline while linha !~ re
rescue EOFError
puts "Fim do arquivo."
linha = nil
else
linha
ensure
if linha.class != String || linha != nil
linha = nil
end
end
O comando retry também pode ser usado no tratamento de erros.
Ele faz com que o bloco atual seja executado novamente, desde o início. Mas
deve-se ter cuidado para não gerar laços infinitos.
Throw/Catch
Os métodos throw e catch são parecidos com
raise e rescue, porém, não lidam com exceções, mas sim
com símbolos ou strings (labels). catch executa o bloco que
lhe é passado, mas pára a execução caso um throw seja executado com
o símbolo correspondente. O objeto retornado é o da última expressão do bloco,
caso ele termine normalmente, ou o que for passado à throw, ou
nil.
resultado = catch(:aie) {
puts "Executando catch ..."
throw(:aie, "ops")
puts "Não vai chegar aqui."
"Fim."
}
puts resultado # >> ops
Isto é útil para sair de um laço de execução muito "profundo", por exemplo.