超时ActiveRecord查询

超时ActiveRecord查询,activerecord,timeout,Activerecord,Timeout,我想使用Ruby core中的Timeout来超时ActiveRecord查询,但是ActiveRecord似乎正在捕获Timeout::Error,并将其包装在ActiveRecord::StatementInvalid异常中 > Timeout::timeout(3) { sleep 4000 } Timeout::Error: execution expired ... > Timeout::timeout(3) { ActiveRecord::Base.connection

我想使用Ruby core中的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错误,并以不同的方式处理它们。 有没有办法区分这两者?(比“执行已过期”的异常消息更干净。)

尝试使用以下代码:

开始
超时::超时(3)do
开始
ActiveRecord::Base.connection.execute“选择pg_睡眠(4)”
rescue ActiveRecord::语句无效
#句柄ActiveRecord::语句无效异常
终止
终止
救援超时::错误
#句柄超时::错误异常
终止

如果您想接收Timeout::Error,您应该在Timeout块中捕获所有其他异常。

您必须实际查看错误消息。
Timeout::Timeout
看似简单,但可能导致非常不可预测的结果。这些文章解释了可能出现的各种错误:--