В Ruby можно записать a rescue
в конце присвоения для фиксации любых ошибок, которые могли бы подойти. У меня есть функция (ниже: a_function_that_may_fail
) где удобно позволить ему бросить ошибку, если определенные условия не соблюдены. Следующий код работает хорошо
post = {}
# Other Hash stuff
post['Caption'] = a_function_that_may_fail rescue nil
Однако я хотел бы не иметь сообщение ['Подпись'] даже набор, если функция перестала работать.
Я знаю, что могу сделать:
begin
post['Caption'] = a_function_that_may_fail
rescue
end
но это чувствует себя немного чрезмерным - там простое решение?
Проблема в старшинстве. Простейшее решение:
(post['Caption'] = a_function_that_may_fail) rescue nil
Изменение старшинства подобным образом немного эзотерично, однако. Вероятно, будет лучше, если вы сможете переписать свою a_функцию_that_may_fail
, чтобы она возвращала nil
в случае неудачи.
Вы также можете использовать временную переменную и проверить ее на нулевость:
caption = a_function_that_may_fail rescue nil
post['Caption'] = caption unless caption.nil?
Действительно незначительное отличие состоит в том, что это не устанавливает post['Caption']
, если a_function_that_may_fail
не вызвала исключения, а вернула nil
.
убедитесь, что ваш метод возвращает либо nil
, либо false
:
def this_may_fail
some_logic rescue nil
end
затем вы можете использовать модификатор if чтобы проверить возвращаемое значение вашего метода и присвоить значение, только если оно не nil
или false
:
post['Caption'] = this_may_fail if this_may_fail
, или вы можете кэшировать возвращаемое значение this_may_fail
в локальной переменной, если вам не нравится вызывать метод дважды для условия if и присваивания.
the_value = this_may_fail
post['Caption'] = the_value if the_value
также заметили, что модификатор rescue
перехватывает только StandardError
и его подклассы.
post.store('Caption', a_function_that_may_fail) rescue nil