我有一个Ruby程序,我需要做一个文件,但我想要的是如果文件不存在则无声地失败。我尝试了以下内容:
require '#{var}' rescue nil
但没有成功(似乎不会捕获错误)。
我现在的实际代码是:
require "Livecheckables/#{formula}" if File.exists? File.expand_path("../../Livecheckables/#{formula}.rb", Pathname.new(__FILE__).realpath)
我怎样才能以简短易懂的方式制作它?
答案 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。