为什么这条线路应该被救出时“不能加载这样的文件”?

时间:2016-07-24 15:51:19

标签: ruby-on-rails

我正按照说明here尝试将puffing-billy添加到Rails应用程序中。

运行测试套件会引发:

in `require': cannot load such file -- capybara/webkit (LoadError)

我使用的是Poltergeist而非Webkit,因此不需要加载此文件。

错误源自puffing-billy中的以下行

# /lib/billy/browsers/capybara.rb 

DRIVERS = {
  poltergeist: 'capybara/poltergeist',
  webkit: 'capybara/webkit',
  selenium: 'selenium/webdriver'
}

def self.register_drivers
  DRIVERS.each do |name, driver|
    require driver rescue next # this line should be rescued
    send("register_#{name}_driver")
  end
end

什么可以阻止require driver被拯救并导致此错误,以及调试此问题的方法是什么?

1 个答案:

答案 0 :(得分:0)

一般来说,在Ruby中使用内联救援是一个坏主意(救援工作在最后)。这是一篇很好的文章,有更多细节:https://www.new-bamboo.co.uk/blog/2015/09/23/dont-inline-rescue-in-ruby/

内联救援和未经过滤的" rescue(没有指定你想要捕获的错误类型)捕获任何从StandardError LoadError继承的异常是而不是 StandardError的后代所以它&#39 ; s不会被你的内联救援抓住。

这是Ruby中的错误层次结构图表: http://blog.honeybadger.io/understanding-the-ruby-exception-hierarchy/

所以这里修改了你的代码,以便它可以工作,也不会发现无意的错误:

DRIVERS.each do |name, driver|
  begin
    require driver
    send("register_#{name}_driver")
  rescue LoadError
    # This skips to the next driver
    # It would be nice to add logging here to notify that the driver was skipped
  end
end