2014-10-22 3 views
1

У меня есть программа Ruby, и мне нужно выполнить требуемый файл, но я хочу, чтобы файл был невозможен, если файл не существует. Я пробовал с:Как заставить «требовать» терпеть неудачу в Ruby

require '#{var}' rescue nil 

но без успеха (кажется, что ошибка не будет снята).

Фактический код, который я есть сейчас:

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

Как я мог бы сделать это в короткий и читаемым образом?

+4

Почему бы вам не перечислить все файлы livecheckables в каталоге и потребовать только фактические существующие файлы? –

ответ

2

Вы можете сделать:

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' 
+0

Спасибо! Он отлично работает. Значит, нет ни одного лайнера? – Alessio

+0

@Alessio - Вы всегда можете обернуть это в методе на ядре, обновленный ответ. – BroiSatse

+2

@ Alessio: Конечно, есть однострочный: 'begin; требуют «бла»; исключение; end' –

2

Как Стефан упоминается в комментариях выше решения, предложенный @BroiSatse делает больше чем вы просили и можете сделать отладку сложнее.

Лучше использовать эту версию:

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

Он подведет молча только тогда, когда ваш конкретный require 'blah' не удалось, сохраняя все другие LoadErrors нетронутыми, а также другие исключения, например, NoMethodError или NameError.

Смежные вопросы