Pratique exemplaire: Essayez vs Rescue

Qu’est-ce qu’une bonne pratique? Pour try ou utiliser un rescue ?

 user.try(:email) 

CONTRE

 user.email rescue nil 

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

CONTRE

 post.comments.first.author rescue nil 

Y a-t-il une différence dans l’utilisation de l’un d’entre eux?

Essayer et sauver servent des objectives différents. Le but de try est de vous éviter de devoir faire:

 if user && user.email 

Ou toute situation où l’object parent peut éventuellement être nul, ce qui provoquerait une erreur NoMethodError sur NilClass. Le but de rescue est de gérer les exceptions déclenchées par votre appel de méthode. Si vous prévoyez qu’une exception appelle user.email , vous pouvez la user.email pour éviter que l’exception ne se déclenche.

En général, je dirais d’éviter d’utiliser rescue nil moins que vous ne sachiez explicitement quelles exceptions vous sauvez parce que vous pourriez sauver une exception différente, et que vous ne le sauriez jamais parce que rescue nil vous empêcherait de le voir. Au minimum, vous pourriez peut-être vous connecter:

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

Les deux semblent louche et peuvent masquer d’autres insectes. Êtes-vous sûr de vouloir vraiment rien y faire? Peut-être vaudrait-il mieux vérifier d’abord s’il y a des commentaires et couvrir explicitement le cas vide?

Nothing is Something est une excellente présentation de Sandi Metz qui aide à comprendre pourquoi @AdamByrtek est sur la bonne voie, et pourquoi nous devrions tous marquer les cas échoués de manière plus intelligente, plus orientée object que x ? y : nil x ? y : nil