2010-03-03 12 views
10

la mayoría de mis aplicaciones tienen mucho que ver con servicios web y, a menudo debido al sitio de terceros, obtengo problemas de tiempo de espera.Cómo rescatar problemas de tiempo de espera (Ruby, Rails)

Este es el error que me sale:

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

¿Cómo rescatar este tipo de error en una aplicación de rieles?

Respuesta

28

Dependiendo de cómo se utiliza la biblioteca, hay diferentes maneras de rescatar la excepción.

En la biblioteca

Suponiendo que ha creado un derivador para acceder a algún tipo de servicio web, puede hacer que la envoltura rescatar la excepción y siempre devuelven un conjunto de datos "seguros".

En la acción

Si se llama a un método específico en la acción y el éxito método es un requisito para la acción, entonces se puede rescatar en la acción. En el siguiente ejemplo rescato el error y muestro una plantilla específica para manejar el problema.

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

En el controlador

Si la llamada al método puede ocurrir en muchas acciones diferentes, es posible que desee utilizar 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

esto es lo que hago en mis aplicaciones carriles:

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

protected 

def handle_exception 
    # do anything you want here 
end 

puede especificar la excepción igual que lo haría en una cláusula de rescate, por supuesto.

Saludos, Joe

+1

Nunca rescatar 'Exception'. Es un mal hábito de programación. Debe rescatar excepciones específicas o al menos, 'StandardError'. –

+1

"Excepción" tenía la intención de aclarar dónde atrapar el específico, pero tienes razón, ¡esto debería haber sido más claro! :) – xijo

+0

Yo sabía cómo hacer esto con ActiveRecord no encontrado. Simplemente no sabía qué o cómo rescatar ese error en particular. – kgpdeveloper

4

Utilice la impresionante Rack::Timeout joya para sus aplicaciones de rack

A continuación, utilice el controlador de la bondad de Simone

Cuestiones relacionadas