微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ruby-on-rails – 处理TimeOut ::重试时出错

我有一个在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

原文地址:https://www.jb51.cc/ruby/269086.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐