Лучшая практика: Попробуйте vs Rescue

Какая практика? Использовать try или использовать rescue?

user.try(:email)

VS

user.email rescue nil

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

VS

post.comments.first.author rescue nil

Есть ли разница в использовании любого из них?

Ответ 1

Попытка и спасение служат различным целям. Цель 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

Ответ 2

Оба кажутся подозрительными и могут маскировать другие ошибки. Вы уверены, что действительно хотите получить нуль? Может быть, лучше проверить, есть ли какие-либо комментарии в первую очередь, и явно покрыть пустой случай?

Ответ 3

Ничего не случилось - замечательный разговор Санди Меца, который помогает понять, почему @AdamByrtek на месте, и почему мы все должны отмечать неудачных случаях более умным, более объектно-ориентированным способом, который x ? y : nil