Лучшая практика: попробуйте против спасения
что такое лучшая практика? Использовать try или использовать rescue?
user.try(:email)
VS
user.email rescue nil
post.try(:comments).try(:first).try(:author)
VS
post.comments.first.author rescue nil
есть ли разница в использовании этих?
3 ответа:
попробуйте и спасательные служат различным целям. Цель
try- это избавит вас от необходимости делать:if user && user.emailили любая ситуация, когда родительский объект может быть равен нулю, что вызовет NoMethodError на NilClass. Цель
rescueдля обработки исключений,которые возникают при вызове метода. Если вы ожидаете исключения из вызоваuser.email, можноrescue nilэто, чтобы предотвратить исключение от пузырящегося вверх.в общем, я бы сказал, Избегайте используя
rescue nilесли вы не знаете явно, какие исключения вы спасаете, потому что вы можете спасти другое исключение, и вы никогда не узнаете об этом, потому чтоrescue nilпомешает вам увидеть его. По крайней мере, может быть, вы могли бы войти в это:begin ...some code... rescue => ex logger.error ex.message end
оба кажутся подозрительными и могут маскировать другие ошибки. Вы уверены, что действительно хотите получить ноль там? Может быть, было бы лучше сначала проверить, есть ли какие-либо комментарии, и явно охватить пустой случай?
ничто-это нечто Это отличный разговор Санди Мец, который помогает понять, почему @AdamByrtek находится на месте, и почему мы все должны отмечать неудачные случаи более умным, более объектно-ориентированным способом, что
x ? y : nil