2010-03-03 58 views
10

我的大部分应用程序都与Web服务有很大关系,并且经常由于第三方网站而导致超时问题。如何解决超时问题(Ruby,Rails)

这是我的错误:

execution expired 
    /usr/lib/ruby/1.8/timeout.rb:54:in `rbuf_fill' 

如何拯救这种错误在Rails应用程序?

回答

28

取决于你如何使用图书馆,也有不同的方式来拯救例外。

在图书馆

假设您创建了一个包装访问某些类型的网络服务,你可以包装抢救例外,总是返回一个“安全”的数据。

在操作

如果调用在采取行动的具体方法和方法的成功是对动作的要求,那么你可以在行动拯救它。 在以下示例中,我挽救了该错误并显示了处理该问题的特定模板。

def action 
    perform_external_call 
rescue Timeout::Error => e 
    @error = e 
    render :action => "error" 
end 

在控制器

如果方法调用可以在许多不同的动作发生时,你可能需要使用rescue_from

class TheController < ApplicationController 

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

    protected 

    def rescue_from_timeout(exception) 
    # code to handle the issue 
    end 

end 
2

这是我在我的Rails应用做:

# in ApplicationController 
rescue_from Your::Exception, :with => :handle_exception 

protected 

def handle_exception 
    # do anything you want here 
end 

您可以指定例外,就像您在课程的救援条款做。

问候, 乔

+1

决不救'Exception'。是一种糟糕的编程习惯。你应该拯救特定的例外,或者至少,'StandardError'。 – 2010-03-03 10:09:34

+1

“异常”是为了澄清在哪里抓住特定的一个,但你是对的,这应该是更清楚了! :) – xijo 2010-03-03 11:40:22

+0

我有点知道如何做到这一点没有找到ActiveRecord。我只是不知道如何解决这个特定的错误。 – kgpdeveloper 2010-03-04 11:22:43