1

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 エラーをキャッチし、それらを別の方法で処理したいので、これは残念です。2つを区別する方法はありますか? (「実行期限切れ」の例外メッセージに一致するよりもクリーンです)。

4

1 に答える 1

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 を受け取りたい場合は、タイムアウト ブロックで他のすべての例外をキャッチする必要があります。

于 2012-11-15T23:59:29.080 に答える