iniciar - ruby on rails download
¿Cómo lidiar con no saber qué excepciones puede generar un método de biblioteca en Ruby? (4)
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 la fuente de la cadena JSON en una estructura de datos de Ruby y devolverla".
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 programadores 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 tener una idea de qué excepciones se generan, 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 que ParserError
un error ParserError
en caso de error (no parece que devolver nil sea 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 tener una idea de qué excepciones se generan, 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.
Nunca puede estar seguro de qué excepciones se pueden generar, a menos que el código de la biblioteca los atrape 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.
Si desea descartar datos JSON no válidos:
begin
res = JSON.parse(string)
rescue JSON::ParserError => e
# string was not valid
end
Supongo que si no se proporciona documentación, tiene que confiar en algo como esto:
begin
# code goes here
rescue
# fail reason is in $!
end