поведение var = что-то спасает ноль - PullRequest
8 голосов
/ 12 апреля 2010

В Ruby вы можете написать rescue в конце задания, чтобы отследить любые ошибки, которые могут возникнуть. У меня есть функция (ниже: a_function_that_may_fail), где удобно позволить ей выдавать ошибку, если определенные условия не выполняются. Следующий код хорошо работает

post = {}
# Other Hash stuff
post['Caption'] = a_function_that_may_fail rescue nil

Однако я бы хотел, чтобы post ['Caption'] даже не устанавливался, если функция не работает.

Я знаю, что могу сделать:

begin
  post['Caption'] = a_function_that_may_fail
rescue
end

но это кажется немного чрезмерным - есть ли более простое решение?

Ответы [ 3 ]

22 голосов
/ 12 апреля 2010

Проблема в приоритете. Самое простое решение:

(post['Caption'] = a_function_that_may_fail) rescue nil

Хотя изменение приоритета немного эзотерично. Вероятно, было бы лучше, если бы вы могли переписать свой a_function_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.

3 голосов
/ 12 апреля 2010
post.store('Caption', a_function_that_may_fail) rescue nil
2 голосов
/ 12 апреля 2010

убедитесь, что ваш метод возвращает либо 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 и его подклассы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...