【问题标题】:Ruby rescue doesn't catch a StandardErrorRuby 救援没有捕捉到 StandardError
【发布时间】:2013-07-13 15:41:37
【问题描述】:

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

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

根据我尝试运行测试时的堆栈跟踪,该代码的第二行 sn-p -- config.before(:all) {...} -- 抛出 Redis::CannotConnectError 。经过大量的“e.class.superclass.superclass...”命令,我确定这个错误继承自StandardError。

之后我就卡住了。我尝试用“rescue Redis::CannotConnectError”捕捉错误,然后是“rescue”,最后是“rescue Exception”,但仍然抛出错误。但是,我在Ruby命令提示符下尝试了同样的事情,并且每次都捕获到异常

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

【问题讨论】:

  • 我不认为这是 Ruby 的问题?你使用 RSpec,对吗?

标签: ruby-on-rails error-handling redis rescue


【解决方案1】:

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

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

config.before(:all) do
  begin
    Resque.redis.select 1
  rescue Exception
    puts "RESCUED REDIS ERROR"
  end
end

# same for config.after(:all)

【讨论】:

  • 非常感谢!这解释了很多
  • 我会告诫不要抓住Exception。有些东西,比如StandardError,它也会捕获,而你根本不知道。
猜你喜欢
  • 2017-03-09
  • 2012-05-08
  • 1970-01-01
  • 2012-04-06
  • 2012-02-26
  • 1970-01-01
  • 1970-01-01
  • 2023-01-13
  • 2017-03-29
相关资源
最近更新 更多