Como lidar com não saber quais exceções podem ser levantadas por um método de biblioteca em Ruby?
Esta é uma questão bastante ampla, mas é uma que continuo a encontrar quando estou programando em Ruby. Eu sou de um fundo em grande parte C e Java, onde quando eu uso uma função de biblioteca ou método, eu olho para a documentação e ver o que ele retorna em erro (geralmente em C) ou que exceções pode jogar (em Java).
Em Ruby, a situação parece completamente diferente. Só agora preciso analisar alguns JSON que recebo de um servidor:
data = JSON.parse(response)
Naturalmente, a primeira coisa que penso depois de escrever este código é, e se a entrada for ruim? Éparse
vai retornar nil em erro, ou levantar alguma exceção, e em caso afirmativo, quais?
Eu verifico a documentação (http://flori.github.com/json/doc/JSON.html#M000022) e veja, simplesmente:
"Analise a fonte da cadeia JSON em uma estrutura de dados Ruby e retorne-a."
Este é apenas um exemplo de um padrão em que corri repetidamente em Ruby. Originalmente, eu percebi que era uma lacuna da documentação de qualquer biblioteca com a qual eu estava trabalhando, mas agora estou começando a sentir que isso é uma prática padrão e estou em uma mentalidade um pouco diferente dos programadores Ruby. Existe alguma convenção de que não tenho conhecimento?
Como os desenvolvedores lidam com isso?
(E sim, olhei o código do método da biblioteca e posso ter uma ideia de quais exceções são levantadas, mas não posso ter 100% de certeza e, se não estiver documentado, sinto-me desconfortável por confiar nele.)
EDITARDepois de olhar as duas primeiras respostas, deixe-me continuar o exemplo de análise JSON acima.
Eu suspeito que não devo fazer:
begin
data = JSON.parse(response)
raise "parse error" if data.nil?
rescue Exception => e
# blahblah
end
porque eu posso olhar para o código / testes e ver parece levantar umParserError
no erro (retornar nil parece não ser uma prática padrão no Ruby). Eu estaria correto em dizer que a prática recomendada é fazer:
begin
data = JSON.parse(response)
rescue JSON::ParserError => e
# blahblah
end
... com base no que aprendi sobreParserError
olhando através do código e testes?
(Eu também editei o exemplo para esclarecer que é uma resposta de um servidor que estou analisando.)