Наличие блока/команды Ruby без проблем завершается без пустого блока "спасения"
Скажем, я хочу, чтобы вызов запускался, и если он терпит неудачу, это не имеет большого значения; программа может продолжаться без проблем. (Я знаю, что это, как правило, плохая практика, но представьте себе гипотетический, быстрый одноразовый script, а не большой проект)
То, как меня научили делать, это:
begin
thing_to_try
rescue
# awkward blank rescue block
end
next_thing
Конечно, есть и другие способы сделать это, включая использование ensure
и тому подобное. Но есть ли способ получить вызов метода/блок для бесшумного отказа без беспорядочного пустого блока?
Ответы
Ответ 1
Может быть полезен такой метод.
def squelch(exception_to_ignore = StandardError, default_value = nil)
yield
rescue Exception => e
raise unless e.is_a?(exception_to_ignore)
default_value
end
Этот метод можно определить внутри class Object
для универсальной доступности.
Затем вы можете написать:
squelch { foo } || squelch { bar }
Настоящим преимуществом такого подхода является использование многострочных блоков, поскольку inline rescue
может использоваться только для одного оператора.
Ответ 2
Это та же идея, но немного менее многословная, но вы можете использовать встроенный синтаксис
thing_to_try rescue nil
next_thing
Ответ 3
В дополнение к идее Ben вы также можете создать функцию для этого
def suppress_errors(&block)
begin
yield
rescue
# awkward blank rescue block
end
end
# call it
suppress_errors {puts "abc"}
suppress_errors do
puts "xyz"
end