2010-04-12 12 views
7

En Ruby puede escribir un rescue al final de una tarea para detectar cualquier error que pueda surgir. Tengo una función (abajo: a_function_that_may_fail) donde es conveniente dejar que arroje un error si ciertas condiciones no se cumplen. El siguiente código funciona biencomportamiento `var = something rescue nil`

post = {} 
# Other Hash stuff 
post['Caption'] = a_function_that_may_fail rescue nil 

Sin embargo, me gustaría tener puesto [ 'Leyenda'] ni siquiera establecer si la función falla.

Sé que puedo hacer:

begin 
    post['Caption'] = a_function_that_may_fail 
rescue 
end 

pero que se siente un poco excesivo - ¿Existe una solución más simple?

+0

Reescribiendo la función no es realmente una opción, es una búsqueda Nokogiri - esencialmente Quiero configurar el elemento hash 'Leyenda' si hay un elemento XML específico, pero importante, no puse si eso XML el elemento no está allí. –

Respuesta

19

El problema es la precedencia. La solución más simple:

(post['Caption'] = a_function_that_may_fail) rescue nil 

Sin embargo, cambiar la precedencia de esta manera es un poco esotérico. Probablemente sería mejor si puede reescribir su a_function_that_may_fail para devolver nil si falla.

También es posible usar una variable temporal y prueba para nilness:

caption = a_function_that_may_fail rescue nil 
post['Caption'] = caption unless caption.nil? 

Una diferencia muy pequeña es que esto no establece si post['Caption']a_function_that_may_fail no lanzar una excepción, pero regresó nil.

+0

(...) rescate nil no es tan esotérico, imho. Es fácil de leer también. –

2

asegurarse de que su método devuelve ya sea nil o false:

def this_may_fail 
    some_logic rescue nil 
end 

A continuación, puede utilizar el caso de modificador para comprobar el valor de retorno de su método y asignar el valor sólo si no es nil o false:

post['Caption'] = this_may_fail if this_may_fail 

o puede almacenar en caché el valor de retorno de this_may_fail en una variable local si no desea llamar al método dos veces para la condición if y la asignación.

the_value = this_may_fail 
post['Caption'] = the_value if the_value 

Observe también que el modificador rescue sólo se capta StandardError y sus subclases.

3
post.store('Caption', a_function_that_may_fail) rescue nil 
+0

Lindo, pero no se aplicará si en lugar de publicar ['Caption'] = fue local_var =. Yo prefiero la solución "esotérica" ​​de molf –

Cuestiones relacionadas