Наличие блока/команды 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