ruby-on-rails – 处理TimeOut ::重试时出错
发布时间:2020-12-17 04:29:13 所属栏目:百科 来源:网络整理
导读:我有一个在Heroku上运行的应用程序,有时会报告Timeout :: Error和(ActionView :: Template :: Error)“执行过期”. 这种情况发生在整个网站上(即不在特定的控制器中)所以我想创建一个能处理这两个错误的函数,首先重试两次并将用户重定向到一个页面,告诉他们
我有一个在Heroku上运行的应用程序,有时会报告Timeout :: Error和(ActionView :: Template :: Error)“执行过期”.
这种情况发生在整个网站上(即不在特定的控制器中)所以我想创建一个能处理这两个错误的函数,首先重试两次并将用户重定向到一个页面,告诉他们服务器是忙. 我目前的计划是在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 我的问题是:如何通过首先重试两次然后将异常/重定向抛出到错误页面来处理这两种类型的错误? 解决方法
定义此方法:
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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |