2014-10-22 72 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。