如何让Ruby中的“require”无声地失败

时间:2014-10-22 11:46:00

标签: ruby

我有一个Ruby程序,我需要做一个文件,但我想要的是如果文件不存在则无声地失败。我尝试了以下内容:

require '#{var}' rescue nil

但没有成功(似乎不会捕获错误)。

我现在的实际代码是:

require "Livecheckables/#{formula}" if File.exists? File.expand_path("../../Livecheckables/#{formula}.rb", Pathname.new(__FILE__).realpath) 

我怎样才能以简短易懂的方式制作它?

2 个答案:

答案 0 :(得分:3)

你可以这样做:

begin
  require 'blah'
rescue LoadError
end

rescue只是抢救StandardError,加载错误不属于这一类。使用Exception将拯救任何类型的异常,包括文件中的语法问题或所需文件中的代码执行问题。但请注意,它也可以终止信号。

您也可以将此包装在一个方法中:

module Kernel
  def silent_require(name)
    require name
  rescue LoadError
    false
  end
end

然后你可以在任何地方使用它:

silent_require 'blah'

答案 1 :(得分:2)

正如Stefan在上面的评论中所提到的,@ BroiSatse提出的解决方案比你提出的要求更多,并且可以使调试变得更加困难。

您最好使用此版本:

begin
  require 'blah'
rescue LoadError => e
  raise e until e.path == 'blah'
end

只有当您的特定require 'blah'无法保持所有其他LoadErrors不受影响以及其他例外情况时,它才会无声地失败,例如NoMethodError或NameError。