2012-03-20 15 views
6

Puede alguien explicar por qué podría ver esta pila (causada por una petición HTTParty :: post) cuando la llamada al método es el siguiente:ejecución expiró excepción chocando rosca Ruby, pero tiempo de espera :: error se maneja

begin 
    response = HTTParty::post(url, options) 
rescue 
    logger.warn("Could not post to #{url}")  
rescue Timeout::Error 
    logger.warn("Could not post to #{url}: timeout")  
end 

la pila:

/usr/local/lib/ruby/1.8/timeout.rb:64:in `timeout' 
/usr/local/lib/ruby/1.8/net/protocol.rb:134:in `rbuf_fill' 
/usr/local/lib/ruby/1.8/net/protocol.rb:104:in `read_all' 
/usr/local/lib/ruby/1.8/net/http.rb:2228:in `read_body_0' 
/usr/local/lib/ruby/1.8/net/http.rb:2181:in `read_body' 
/usr/local/lib/ruby/1.8/net/http.rb:2206:in `body' 
/usr/local/lib/ruby/1.8/net/http.rb:2145:in `reading_body' 
/usr/local/lib/ruby/1.8/net/http.rb:1053:in `request_without_newrelic_trace' 
[GEM_ROOT]/gems/newrelic_rpm-3.1.1/lib/new_relic/agent/instrumentation/net.rb:20:in `request' 
[GEM_ROOT]/gems/newrelic_rpm-3.1.1/lib/new_relic/agent/method_tracer.rb:242:in `trace_execution_scoped' 
[GEM_ROOT]/gems/newrelic_rpm-3.1.1/lib/new_relic/agent/instrumentation/net.rb:19:in `request' 
/usr/local/lib/ruby/1.8/net/http.rb:1037:in `request_without_newrelic_trace' 
/usr/local/lib/ruby/1.8/net/http.rb:543:in `start' 
/usr/local/lib/ruby/1.8/net/http.rb:1035:in `request_without_newrelic_trace' 
[GEM_ROOT]/gems/newrelic_rpm-3.1.1/lib/new_relic/agent/instrumentation/net.rb:20:in `request' 
[GEM_ROOT]/gems/newrelic_rpm-3.1.1/lib/new_relic/agent/method_tracer.rb:242:in `trace_execution_scoped' 
[GEM_ROOT]/gems/newrelic_rpm-3.1.1/lib/new_relic/agent/instrumentation/net.rb:19:in `request' 
[GEM_ROOT]/gems/httparty-0.7.8/lib/httparty/request.rb:69:in `perform' 
[GEM_ROOT]/gems/httparty-0.7.8/lib/httparty.rb:390:in `perform_request' 
[GEM_ROOT]/gems/httparty-0.7.8/lib/httparty.rb:358:in `post' 
[GEM_ROOT]/gems/httparty-0.7.8/lib/httparty.rb:426:in `post' 

Como se puede ver, yo estoy manejando la excepción de tiempo de espera :: error. Esto está en Ruby 1.8.7. Soy muy consciente de que en Ruby 1.8.7, StandardException y TimeoutException tienen diferentes árboles de herencia, por lo que manejo ambos, pero no parece marcar la diferencia.

+0

Tengo un problema similar. Lo que es peor es que realmente he configurado un servicio falso localmente y el error se rescata con éxito cuando provoco un tiempo de espera en mi sistema local. En producción, nunca se llama al controlador de errores. –

Respuesta

4

Cuando omite la clase de excepción en rescue, capturará cualquier StandardError. Como Timeout::Error es una subclase de StandardError, se capturará con la primera instrucción rescue. Si desea capturarlo por separado, debe colocarlo antes que el omitido:

begin 
    response = HTTParty::post(url, options) 
rescue Timeout::Error 
    logger.warn("Could not post to #{url}: timeout")  
rescue 
    logger.warn("Could not post to #{url}")  
end 
+5

Timeout :: El error no es una subclase de StandardError en Ruby 1.8.7: http://martinciu.com/2010/12/ruby-timeout-error-is-not-a-standard-error.html y http://jerith.livejournal.com/40063.html. Además, en el problema al que me enfrento, la excepción no es manejar el rescate Timeout :: Error o el rescate desnudo. – esilver

Cuestiones relacionadas