Executando métodos sem se preocupar com exceções no Ruby
14/07/08
Cansado de ter que verificar se um objeto existe antes de chamar algum método ou acessar um atributo?
if @object && @object.some && @object.some.fancy && @object.some.fancy.call
# do something
else
puts "meh. i don't like this syntax!"
end
Concordo que isto não é muito comum, mas você já deve ter feito algo como isto:
if @object && @object.respond_to?(:some_method) && @object.some_method
# do something
end
Evite este tipo de aborrecimento trazido por estas verificações, adicionando um método como este:
def try(&block)
raise 'No block given' unless block_given?
yield rescue nil
end
if try { @objet.some.fancy.call }
# do something
else
puts 'hey! this call returned nil, false or threw an exception'
end
Muito mais com a cara de Ruby, não acha?
- Permalink
- Trackback
- Feed dos comentários
- Ao som de: Kay Hanley – Mean Streak

Comentários #
Uma referência…
http://ozmm.org/posts/try.html
Abraço…
Tino, nesta implementação ainda é preciso conhecer o escopo de onde o método será chamado. Mas é bem legal! ;)
Esse try já deu o que falar há algum tempo atrás, mas acho bem legal. :)
O problema desse tipo de técnica é que esconde um mundo de detalhes que muitas vezes não deviam ser ignorados. Numa tentativa de economizar uns caracteres para não ter que testar continuamente por nil, todas as exceções são engolidas. Testar por NoMethodError já seria genérico demais, omitir todas então…
No final das contas, eu acabo preferindo uma solução como a do Weavejester: http://weavejester.com/node/10
O uso fica um pouco mais extenso, mas a implementação é bastante simples e eficiente.
Deixe um comentário