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