关于错误处理:Ruby rescue没有捕获StandardError

Ruby rescue doesn't catch a StandardError

我正在为Ruby Rails应用程序编写测试,并且我有一块代码块,如果Ruby无法连接到它,它应该捕获我的Redis服务器抛出的错误。 目前,代码如下所示:

1
2
3
4
5
6
begin
    config.before(:all) { Resque.redis.select 1 }
    config.after(:all) { Resque.redis.keys("queue:*").each { |key| Resque.redis.del key } }
rescue Exception
    puts"RESCUED REDIS ERROR"
end

根据我尝试运行测试时的堆栈跟踪,该代码片段的第二行 - config.before(:all){...} - 抛出Redis :: CannotConnectError。 在经过很多"e.class.superclass.superclass ..."命令之后,我确定这个错误继承自StandardError。

之后我卡住了。 我尝试用"rescue Redis :: CannotConnectError"捕获错误,然后"救援",最后"救援Exception",但仍然抛出错误。 但是,我在Ruby命令提示符中尝试了相同的操作,每次都会捕获异常

谁能帮我弄清楚这里发生了什么? 谢谢!


问题是传递给beforeafter的块在定义它们时没有被执行; 相反,它们被存储,然后在每个spec文件运行之前和之后由Rspec调用。

您可能希望在块内移动开始/救援:

1
2
3
4
5
6
7
8
9
config.before(:all) do
  begin
    Resque.redis.select 1
  rescue Exception
    puts"RESCUED REDIS ERROR"
  end
end

# same for config.after(:all)