Лучшая практика: попробуйте против спасения
что такое лучшая практика? Использовать 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