2011-05-19 13 views
61

¿Qué es una mejor práctica? Para usar try o use rescue?Mejor práctica: prueba vs rescate

user.try(:email) 

VS

user.email rescue nil 

post.try(:comments).try(:first).try(:author) 

VS

post.comments.first.author rescue nil 

¿Hay alguna diferencia en el uso de alguno de estos?

Respuesta

95

Probar y rescatar para diferentes propósitos. El propósito de try es para salvarte de tener que hacer:

if user && user.email 

O cualquier situación en la que el objeto padre, posiblemente, puede ser nulo, lo que causaría un NoMethodError en NilClass. El propósito de rescue es manejar las excepciones que arroja la invocación de su método. Si espera que una excepción llame al user.email, puede rescue nil para evitar que la excepción se propague.

En general, yo diría que evitar el uso de rescue nil a menos que sepa lo que explícitamente excepciones estás rescatando porque usted podría ser el rescate de un excepción diferente, y que nunca se sabe porque rescue nil sería evitar que verlo. Por lo menos tal vez se podría iniciar la sesión que:

begin 
    ...some code... 
rescue => ex 
    logger.error ex.message 
end 
+0

Ojalá esto tuviera un enlace a la fuente de prueba. –

+4

Aquí está el [documento y la fuente] (http://api.rubyonrails.org/classes/Object.html#method-try) a 'ActiveSuppot # try'. –

8

Ambos parecen sospechosos y pueden enmascarar otros errores. ¿Estás seguro de que realmente quieres llegar a cero? ¿Tal vez sería mejor verificar primero si hay algún comentario y cubrir el caso vacío explícitamente?

4

Nothing is Something es una excelente charla de Sandi Metz que ayuda a entender por qué @AdamByrtek en el clavo, y por qué todos deberíamos estar marcando los casos fallidos en una forma más inteligente, más modo orientado a objetos que x ? y : nil

+2

Gran charla, gracias por compartir, pero esto debería ser un comentario. – Stefan

+0

Buen punto, gracias. Lo hará la próxima vez. Es mi primera respuesta, así que estoy un poco emocionado :) –

Cuestiones relacionadas