すべてのアクションをタイムアウト ブロックに入れるために、アプリケーション コントローラーに around_filter を設定して、Heroku の 30 秒の制限に達する前にアクションが失敗するようにしています。これらのタイムアウトをきれいに救うために、rescue_from Timeout::Error もあります。残念ながら、rescue_from は時々しか機能しません。
コントローラー内で実行中にタイムアウトが発生した場合は問題なく動作しますが、ビューまたはヘルパー内でタイムアウトが発生した場合はレスキューに失敗します。
Timeout::Error の継承元である Interrupt も SignalException も、正しくレスキューしません。ただし、例外自体をレスキューすると、ビューとヘルパー内で正しくレスキューされます。
around_filter :timeout
rescue_from Timeout::Error, :with => :timeout_rescue
def timeout
Timeout::timeout(10){
yield
}
end
def timeout_rescue
# Rescued
end
これを機能させるために Timeout::Error を救う他の方法はありますか?