打印

[问题求助] 这个异常用rescue无法捕获 导致程序退出

这个异常用rescue无法捕获 导致程序退出



1.upto(100){|idx|
{
 begin
  url = "/{idx}.html"
  ...
  req = Net::HTTP.new(site,80,proxy['ip'],proxy['port']) #第3,4个参数是从网络上抓取的代理服务器 不是很稳定
  resp,data = req.get(url) #就是这行代码抛出的错误
  rescue
   redo
  end
}


d:/ruby/lib/ruby/1.8/timeout.rb:54:in `rbuf_fill': execution expired (Timeout::E
rror)
   from d:/ruby/lib/ruby/1.8/timeout.rb:56:in `timeout'
   from d:/ruby/lib/ruby/1.8/timeout.rb:76:in `timeout'
   from d:/ruby/lib/ruby/1.8/net/protocol.rb:132:in `rbuf_fill'
   from d:/ruby/lib/ruby/1.8/net/protocol.rb:116:in `readuntil'
   from d:/ruby/lib/ruby/1.8/net/protocol.rb:126:in `readline'
   from d:/ruby/lib/ruby/1.8/net/http.rb:2029:in `read_status_line'
   from d:/ruby/lib/ruby/1.8/net/http.rb:2018:in `read_new'
   from d:/ruby/lib/ruby/1.8/net/http.rb:1059:in `request'
   from d:/ruby/lib/ruby/1.8/net/http.rb:1046:in `request'
   from d:/ruby/lib/ruby/1.8/net/http.rb:547:in `start'
   from d:/ruby/lib/ruby/1.8/net/http.rb:1044:in `request'
   from d:/ruby/lib/ruby/1.8/net/http.rb:781:in `get'
   from D:/rubywork/shooter/dl.rb:64

[ 本帖最后由 rubylee 于 2008-4-18 13:39 编辑 ]
埋头做事 低头做人

TOP

已经找到解决办法了 是我对ruby的异常机制不了解 默认原来只捕捉StandardException类型的异常

Net::HTTP在请求的时候经常会报出这个timeout错误,没办法rescue截获,没办法截获的原因是这个timout错误不是一个StandardError类,而是一个Error类异常。

打开protocol.rb,找到rbuff_fill方法,把

def rbuff_fill
 timeout(@read_timeout){
    @rbuff << @io.sysread(1024)
  }
end


改成

def rbuff_fill
 timeout(@read_timeout, ProtocolError) {
    @rbuff << @io.sysread(1024)
  }
end


因为timeout函数的原型是

def timeout(sec, exception = Error)
  ...
end


exception是Error,Error继承自Interrupt,Interrupt是rescue无法捕获的。

[ 本帖最后由 rubylee 于 2008-4-18 14:05 编辑 ]
本帖最近评分记录
  • bbschat R币 +5 学习了! 2008-4-18 21:23
  • 5swords R币 +8 不错! 2008-4-18 14:36
埋头做事 低头做人

TOP

学习了

TOP

手表短消息接收器//无线看字传输摄像针/孔摄像机

提示: 作者被禁止或删除 内容自动屏蔽

TOP

2008-11-20 07:14 Crawled by CCBot/1.0 (+http://www.commoncrawl.org/bot.html) @38.103.63.61