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.

topo da página

<< Página Anterior | índice | Próxima Página >>
Apostilas de Ruby e RGSS

nossos tutoriais

navegue

livros recomendados