超时ActiveRecord查询

时间:2012-11-09 11:40:19

标签: activerecord timeout

我想使用Ruby核心中的Timeout超时ActiveRecord查询,但ActiveRecord似乎正在捕获Timeout::Error并将其包装在ActiveRecord::StatementInvalid例外中。

> Timeout::timeout(3) { sleep 4000 }
Timeout::Error: execution expired
...

> Timeout::timeout(3) { ActiveRecord::Base.connection.execute "select pg_sleep(4)"}
(3001.5ms)  select pg_sleep(4)
: execution expired: select pg_sleep(4)
ActiveRecord::StatementInvalid: : execution expired: select pg_sleep(4)
...

这很不幸,因为我还想捕获生成ActiveRecord::StatementInvalid异常的真正SQL错误,并以不同方式对待它们。 有没有办法区分这两者? (清除比匹配“执行过期”的异常消息)。

1 个答案:

答案 0 :(得分:0)

尝试使用此代码:

begin  
  Timeout::timeout(3) do  
    begin  
      ActiveRecord::Base.connection.execute "select pg_sleep(4)"  
    rescue ActiveRecord::StatementInvalid  
      # handle ActiveRecord::StatementInvalid exception  
    end
  end
rescue Timeout::Error  
  # handle Timeout::Error exception
end

如果你想接收Timeout :: Error,你应该捕获超时块中的所有其他异常。