kenlistian

勤学多思

  IT博客 :: 首页 :: 新随笔 ::  :: 聚合  :: 管理 ::
  412 随笔 :: 0 文章 :: 23 评论 :: 0 Trackbacks

采用nethttp去处理数据时,常常会报出 rbuf_fill报出timeout错误。ruby跳出执行。

其实解决方法很简单,有3种,

第一种方法,加异常保护,不允许ruby弹出。
直接在方法体中加入
....

rescue Interrupt=>e
  (or Timeout::Error =>e 不认得Timeout则需加require 'Timeout',为啥,后面讲)
  ....
end


第二种是加Timeout::timeout处理,再包一层,

response = Timeout::timeout(3){
    Net::Http.get(....)
     ....
     }

rescue Timeout::Error=>e
   puts e.message
rescue =>e
   ...
end


第三种解决方法,打开protocol.rb,就是那个报rbuf_fill的那个地方,修改代码
def rbuf_fill
timeout(@read_timeout)  {
@rbuf << @io.sysread(1024)
}
end

def rbuf_fill
timeout(@read_timeout,ProtocolError) {
@rbuf << @io.sysread(1024)
}

end
加一个参数;因为ProtocolError是继承StandardError类异常,而rescue能够扑捉到,
而原函数中timeout是默认Error类异常,看原timeout函数
  def timeout(sec, exception=Error)
。。。。
end
其中raise抛出的是Error类错误,而Error是来自  Error<Interrupt,而Interrupt,属于enscue无法扑捉到的,
所以改为standardError则可以扑捉到。

其实理解了,不过在写程序如果异常保护无法保护时,用else 或者根据跳出错误类型在rescue下就可以了。
,或者干脆从异常Exception类下拦截,而不是从standarderror类拦,就可以杜绝任何异常了。


	
posted on 2008-03-27 21:29 kenlistian 阅读(1075) 评论(0)  编辑 收藏 引用 所属分类: Ruby
只有注册用户登录后才能发表评论。