我有一个在Heroku上运行的应用程序,有时报告超时::错误和(ActionView :: Template ::错误)“执行过期”。
这种情况发生在整个网站上(即不在特定的控制器中)所以我想创建一个能够处理这两个错误的函数,首先重试两次并将用户重定向到一个告诉他们的页面服务器很忙。
我目前的计划是在ApplicationController中使用以下内容:
rescue_from Timeout::Error, :with => :rescue_from_timeout
def rescue_from_timeout
sleep 2
retry
end
但这只是循环和循环。我想让它在两次尝试后破裂。我怎么能这样做?
另外,如何处理“执行过期”的ActionView :: Template :: Error?我不想通过重试来挽救所有的ActionView :: Template :: Error,只会引发“执行过期”。
这就是我的例外情况:
[Exception] home#index (ActionView::Template::Error) "execution expired"
或
[Exception] calculations#result (ActionView::Template::Error) "Timeout::Error: execution expired
我的问题是:如何通过首先重试两次然后将异常/重定向抛出到错误页面来处理这两种类型的错误?
答案 0 :(得分:15)
定义此方法:
def retryable(options = {})
opts = { :tries => 1, :on => Exception }.merge(options)
retry_exception, retries = opts[:on], opts[:tries]
begin
return yield
rescue retry_exception
if (retries -= 1) > 0
sleep 2
retry
else
raise
end
end
end
并致电:
retryable(:tries => 10, :on => Timeout::Error) do
your_code_here
end
您可以将它放在应用程序控制器中的around_filter中,这是rails应用程序中所有控制器的基类:
class ApplicationController < ActionController::Base
around_filter :retry_on_timeout
def retry_on_timeout
retryable(:tries => 10, :on => Timeout::Error) do
yield
end
end
end