在获取网页时,如何捕获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?
- 调整Nokogiri连接的超时
- 使用Ruby on Rails将JSON / XML数据发布到Web服务
- 证书续订后,Ruby Net :: HTTP响应OpenSSL :: SSL :: SSLError“证书validation失败”
- Ruby,Tor和Net :: HTTP :: Proxy
- TypeError:无法将Net :: HTTPOK转换为String
- 使用Net / http发布JSON格式的Ruby数据
- Net :: HTTP对HTTPS请求的响应非常慢
- 为什么我得到Net :: HTTP“请求路径为空”错误?
- 使用ruby Net:HTTP API将文件上载到远程apache服务器失败,发生409冲突