在获取网页时,如何捕获Ruby中的“处理时出错:缓冲区错误”?

我正在使用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 => e … 

偶尔,我在“rest = http.get(uri)”行上收到错误

 Error during processing: buffer error /Users/mikeb/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/net/http/response.rb:364:in `finish' /Users/mikeb/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/net/http/response.rb:364:in `finish' /Users/mikeb/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/net/http/response.rb:266:in `ensure in inflater' /Users/mikeb/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/net/http/response.rb:265:in `inflater' /Users/mikeb/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/net/http/response.rb:281:in `read_body_0' /Users/mikeb/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/net/http/response.rb:202:in `read_body' /Users/mikeb/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/net/http.rb:1157:in `block in get' /Users/mikeb/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/net/http.rb:1446:in `block in transport_request' /Users/mikeb/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/net/http/response.rb:163:in `reading_body' /Users/mikeb/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/net/http.rb:1445:in `transport_request' /Users/mikeb/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/net/http.rb:1407:in `request' /Users/mikeb/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/net/http.rb:1156:in `get' /Users/mikeb/Documents/workspace/runtrax/app/helpers/webpage_helper.rb:99:in `block in get_content' 

我如何捕获此错误? 你看到我正在捕捉的错误类型,但我不知道如何捕获我得到的特定错误。 我的意图是如果发生这样的错误就重试。

永远都是

 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 => e … rescue Zlib:BufError => e # end 

错误是从@inflate.finish抛出的,其中@inflate = Zlib::Inflate.new(32 + Zlib::MAX_WBITS) 。 您可能必须要求zlib显式捕获错误,请参阅: 如何在Ruby on Rails代码中捕获Zlib :: BufError?