Ruby on Rails 2.1 - Tratamento de exceções
Execução e exceção sempre andam juntas. Se você estiver abrindo um arquivo que não existe, será necessário lidar com essa situação adequadamente ou seu programa será considerado de qualidade inferior.
O programa pára se ocorrer uma exceção. As exceções são usadas para tratar vários tipos de erros, que podem ocorrer durante a execução de um programa e tomar a ação apropriada em vez de interromper o programa completamente.
O tratamento de exceções em Ruby on Rails é semelhante ao tratamento de exceções em Ruby. O que significa que incluímos o código que poderia gerar uma exceção em um bloco de início / fim e usar cláusulas de resgate para informar a Ruby os tipos de exceções que queremos tratar.
Sintaxe
begin
# -
rescue OneTypeOfException
# -
rescue AnotherTypeOfException
# -
else
# Other exceptions
ensure
# Always will be executed
end
Tudo, do início ao resgate, está protegido. Se ocorrer uma exceção durante a execução deste bloco de código, o controle é passado para o bloco entre o resgate e o fim .
Para cada resgate cláusula no início do bloco, Ruby compara a exceção levantada contra cada um dos parâmetros, por sua vez. A correspondência será bem-sucedida se a exceção nomeada na cláusula de resgate for igual ao tipo da exceção lançada atualmente ou se for uma superclasse dessa exceção.
Onde registrar erros?
Você tem três opções quando uma exceção é lançada -
Registre-se em um arquivo de registro interno (logger.error)
Exibir uma mensagem apropriada para o usuário
Reexibir a página original para continuar
O relatório de erros para o aplicativo é feito para uma estrutura chamada flash . O flash é um depósito de hash para conter sua mensagem até a próxima solicitação antes de ser excluído automaticamente. Você pode acessá-lo com a variável @flash. A seguir está a forma mais simples de usar o módulo logger para registrar mensagens de erro em um arquivo interno.
begin
.........
rescue Exception => exc
logger.error("Message for the log file #{exc.message}")
flash[:notice] = "Store error message"
redirect_to(:action => 'index')
end
Para exibir todas as mensagens de @flash em sua visualização ou layout (.html.erb), você pode adicionar o seguinte -
<% @flash[:notice] -%>
<div id="notice"><%= @flash[:notice] %></div>
<% end -%>