¿Cómo lidiar con no saber qué excepciones puede generar un método de biblioteca en Ruby?

Esta es una pregunta un tanto amplia, pero es una que continúo encontrando cuando programo en Ruby. Soy de un fondo en gran parte de C y Java, donde cuando uso una función o método de biblioteca, miro la documentación y veo lo que devuelve en caso de error (generalmente en C) o qué excepciones puede lanzar (en Java).

En Ruby, la situación parece completamente diferente. Justo ahora necesito analizar algunos JSON que recibo de un servidor:

data = JSON.parse(response) 

Naturalmente, lo primero que pienso después de escribir este código es, ¿qué pasa si la entrada es mala? ¿ parse devolverá cero en caso de error, o generará alguna excepción, y si es así, cuáles?

Reviso la documentación ( http://flori.github.com/json/doc/JSON.html#M000022 ) y veo, simplemente:

“Analizar el origen de la cadena JSON en una estructura de datos de Ruby y devolverlo”.

Este es solo un ejemplo de un patrón que he encontrado repetidamente en Ruby. Originalmente, pensé que era una deficiencia de la documentación de cualquier biblioteca con la que estaba trabajando, pero ahora estoy empezando a sentir que esto es una práctica estándar y tengo una mentalidad algo diferente a la de los progtwigdores de Ruby. ¿Hay alguna convención que desconozco?

¿Cómo lidian los desarrolladores con esto?

(Y sí, miré el código del método de la biblioteca, y puedo hacerme una idea de qué excepciones se producen, pero no puedo estar 100% seguro y si no está documentado, me siento incómodo al confiar en él).

EDITAR : Después de ver las dos primeras respuestas, permítame continuar con el ejemplo de análisis JSON de arriba.

Sospecho que no debería hacer:

 begin data = JSON.parse(response) raise "parse error" if data.nil? rescue Exception => e # blahblah end 

porque puedo ver el código / las pruebas y ver que parece generar un error ParserError en caso de error (devolver nil parece no ser una práctica estándar en Ruby). ¿Sería correcto al decir que la práctica recomendada es hacer:

 begin data = JSON.parse(response) rescue JSON::ParserError => e # blahblah end 

… basado en lo que aprendí sobre ParserError al revisar el código y las pruebas?

(También edité el ejemplo para aclarar que es una respuesta de un servidor que estoy analizando).

(Y sí, miré el código del método de la biblioteca, y puedo hacerme una idea de qué excepciones se producen, pero no puedo estar 100% seguro y si no está documentado, me siento incómodo al confiar en él).

Sugiero echar un vistazo a las pruebas, ya que mostrarán algunos de los escenarios “probables” y lo que podría plantearse. No olvides que las buenas pruebas también son documentación.

Supongo que si no se proporciona documentación, tienes que confiar en algo como esto:

 begin # code goes here rescue # fail reason is in $! end 

Si desea descartar datos JSON no válidos:

 begin res = JSON.parse(string) rescue JSON::ParserError => e # string was not valid end 

Nunca puede estar seguro de qué excepciones se pueden generar, a menos que el código de la biblioteca los capture todos y luego los envuelva. Su mejor apuesta es asumir una buena entrada de su código al desinfectar lo que entra y luego usar su propio manejo de excepciones de nivel superior para detectar una mala entrada de sus entradas.