gpt4 book ai didi

ruby-on-rails - 处理超时::错误,重试

转载 作者:行者123 更新时间:2023-12-04 05:33:24 24 4
gpt4 key购买 nike

我有一个在Heroku上运行的应用程序,有时会报告 Timeout::Error (ActionView::Template::Error)“执行已过期”

这种情况在整个网站上都会发生(即不在特定的 Controller 中),因此我想创建一个处理这两个错误的函数,首先通过重试两次并将用户重定向到一个告诉他们服务器的页面。忙。

我当前的计划是在ApplicationController中使用以下内容:

  rescue_from Timeout::Error, :with => :rescue_from_timeout

def rescue_from_timeout
sleep 2
retry
end

但这只会循环循环。我希望它在两次尝试后就破裂。我怎样才能做到这一点?

另外,如何处理“执行过期”的ActionView::Template::Error?我不想通过重试来挽救所有的ActionView::Template::Error,而仅是那些引发“执行到期”的错误。

这就是我的异常(exception)情况:
[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

您可以将其放在应用程序 Controller 中的around_filter中,这是rails应用程序中所有 Controller 的基类:
class ApplicationController < ActionController::Base

around_filter :retry_on_timeout

def retry_on_timeout
retryable(:tries => 10, :on => Timeout::Error) do
yield
end
end
end

关于ruby-on-rails - 处理超时::错误,重试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9020648/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com