Наличие блока / команды Ruby молча завершается сбоем без пустого «спасательного» блока - PullRequest
12 голосов
/ 09 сентября 2010

Скажи, что я хочу, чтобы звонок был запущен, и если он не сработает, это не страшно; Программа может продолжаться без проблем. (Я знаю, что это обычно плохая практика, но представьте гипотетический, быстрый одноразовый сценарий, а не большой проект)

То, как меня учили это, было:

begin
  thing_to_try
rescue
  # awkward blank rescue block
end
next_thing

Конечно, есть и другие способы сделать это, включая ensure и тому подобное. Но есть ли способ заставить вызов метода / блок молча потерпеть неудачу без грязного пустого блока?

Ответы [ 3 ]

21 голосов
/ 09 сентября 2010

Это та же идея, но немного менее многословно, но вы можете использовать встроенный синтаксис

thing_to_try rescue nil
next_thing
13 голосов
/ 09 сентября 2010

Такой метод может быть полезен.

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 }

Реальным преимуществом такого подхода является то, что вы можете использовать многострочные блоки, поскольку встроенные rescue могут использоваться только для одного оператора.

1 голос
/ 09 сентября 2010

В дополнение к идее 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...