在RoR中,如何从“无法打开TCP连接…(一般SOCKS服务器故障)”错误中恢复?

我正在使用Rails 4.2.7。 目前我正在通过SOCKS代理请求网页

begin ... res1 = Net::HTTP.SOCKSProxy('127.0.0.1', 50001).start(uri.host, uri.port) do |http| puts "launching #{uri}" resp = http.get(uri) status = resp.code content = resp.body content_type = resp['content-type'] content_encoding = resp['content-encoding'] end ... rescue OpenURI::HTTPError => ex ... rescue SocketError, Net::OpenTimeout, Zlib::BufError => e ... end 

偶尔我会得到以下错误..

 Error during processing: Failed to open TCP connection to otherwebsite.com:80 (general SOCKS server failure) /Users/mikeb/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/net/http.rb:882:in `rescue in block in connect' /Users/mikeb/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/net/http.rb:879:in `block in connect' /Users/mikeb/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/timeout.rb:91:in `block in timeout' /Users/mikeb/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/timeout.rb:101:in `timeout' /Users/mikeb/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/net/http.rb:878:in `connect' /Users/mikeb/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/net/http.rb:863:in `do_start' /Users/mikeb/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/net/http.rb:852:in `start' /Users/mikeb/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/net/http.rb:584:in `start' /Users/mikeb/Documents/workspace/runtrax/app/helpers/webpage_helper.rb:96:in `get_content' /Users/mikeb/Documents/workspace/runtrax/app/helpers/webpage_helper.rb:32:in `get_url' /Users/mikeb/Documents/workspace/runtrax/app/services/onlinerr_race_finder_service.rb:42:in `get_race_list' /Users/mikeb/Documents/workspace/runtrax/app/services/abstract_race_finder_service.rb:26:in `process_data' /Users/mikeb/Documents/workspace/runtrax/app/services/run_crawlers_service.rb:18:in `block in run_all_crawlers' /Users/mikeb/.rvm/gems/ruby-2.3.0/gems/activerecord-4.2.7.1/lib/active_record/relation/delegation.rb:46:in `each' /Users/mikeb/.rvm/gems/ruby-2.3.0/gems/activerecord-4.2.7.1/lib/active_record/relation/delegation.rb:46:in `each' 

如何捕获此错误并重试我的请求?

编辑:我的问题与被问到的有什么不同? 副本指的是缓冲区错误,此问题处理套接字错误。

你可以retry

 retries = 0 begin res1 = Net::HTTP.SOCKSProxy('127.0.0.1', 50001).start(uri.host, uri.port) do |http| puts "launching #{uri}" resp = http.get(uri) status = resp.code content = resp.body content_type = resp['content-type'] content_encoding = resp['content-encoding'] end rescue => e retries += 1 if retries < 3 retry # <-- Jumps to begin else # Error handling code, eg logger.warn "Couldn't connect to proxy: #{e}" end end