Лучшая практика: попробуйте против спасения


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

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