我想使用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错误,并以不同方式对待它们。
有没有办法区分这两者? (清除比匹配“执行过期”的异常消息)。
答案 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,你应该捕获超时块中的所有其他异常。