2012-03-20 13 views
6

işlenir:Yürütme Yakut iplik çökmesini istisna sona ermesine karşın, zaman aşımı :: Hata yöntemine çağrı şöyle zaman (bir HTTParty :: sonrası isteği nedeniyle) bu yığını görebilirsiniz neden kimse açıklayabilir

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 

yığını: Gördüğünüz gibi

/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' 

, ben zaman aşımı :: Hata istisnası taşıma ediyorum. Bu Ruby 1.8.7'de. Ruby 1.8.7'de StandardException ve TimeoutException'ın farklı miras ağaçlarına sahip olduğunun farkındayım, bu yüzden her ikisini de ele alıyorum, ama bir fark yaratmıyor gibi görünüyor. Eğer rescue istisna sınıfını atladığınızda

+0

Benzer bir sorun yaşıyorum. Daha da kötüsü, yerel olarak bir sahte hizmet kurdum ve yerel sistemimde zaman aşımı oluştuğunda hata başarıyla kurtarıldı. Üretimde, hata işleyici asla çağrılmaz. –

cevap

4

, herhangi StandardError yakalayacaktır. Timeout::Error, StandardError'un bir alt sınıfı olduğundan, ilk rescue bildirimi tarafından yakalanacaktır. Ayrı olarak yakalamak istiyorsanız, bunu ihmal edilen birinden önce yerleştirmeniz gerekir:

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

Zaman aşımı :: Hata, Ruby 1.8.7'deki StandardError alt sınıfı değil: http://martinciu.com/2010/12/ruby-timeout-error-is-not-a-standard-error.html ve http://jerith.livejournal.com/40063.html. Ayrıca, karşı karşıya olduğum sorun, istisna kurtarma Timeout :: Hata veya çıplak kurtarma tarafından ele değildir. – esilver

İlgili konular