如果没有空白的“rescue”块,Ruby块/命令会无声地失败

时间:2010-09-08 22:41:47

标签: ruby syntax

说我想要一个电话来运行,如果它失败了,那没什么大不了的;程序可以继续没有问题。 (我知道这通常是不好的做法,但想象一个假设的,快速的一次性脚本,而不是一个大项目)

我被教导这样做的方式是:

begin
  thing_to_try
rescue
  # awkward blank rescue block
end
next_thing

当然,还有其他方法可以做到这一点,包括使用ensure等等。但有没有办法让方法调用/阻止静默失败而没有乱码空白块?

3 个答案:

答案 0 :(得分:21)

这是相同的想法,但不那么冗长,但你可以使用内联语法

thing_to_try rescue nil
next_thing

答案 1 :(得分:13)

这样的方法可能会有所帮助。

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只能用于单个语句。

答案 2 :(得分:1)

除了 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