2014-10-22 23 views
1

我有一个Ruby程序,我需要做一个文件,但是我想要的是如果文件不存在,就会自动失败。我试着用以下方法:如何使Ruby中的“require”无提示失败

require '#{var}' rescue nil 

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

实际的代码我现在是:

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

我怎么能使其在短期和可读的方式?

+4

为什么不列举目录中的所有livecheckables并只需要实际存在的文件? – 2014-10-22 11:56:24

回答

2

你可以这样做:

begin 
    require 'blah' 
rescue LoadError 
end 

rescue只抢救StandardError的,负载误差不属于这一类。使用异常可以挽救任何类型的异常,包括文件中的语法问题或者在所需文件中的代码执行问题。但是请注意,它也会从终止信号中解救出来。

你总是可以在方法中把这个包,以及:

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

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

silent_require 'blah' 
+0

谢谢!它效果很好。那么没有一个班轮可用? – Alessio 2014-10-22 11:55:40

+0

@Alessio - 你可以随时在内核的方法中包装这个,更新答案。 – BroiSatse 2014-10-22 11:59:04

+2

@Alessio:当然,这里有一句话:'begin;要求'等等';救援例外;结束' – 2014-10-22 12:14:18

2

正如斯特凡由@BroiSatse确实更提出上述方案所提的意见比你问的要多,可以使调试更加困难。

你最好使用此版本:

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

只有当您的具体require 'blah'未能保持所有其他LoadErrors不变以及其他异常例如它会默默地失败NoMethodError或NameError。