采用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类拦,就可以杜绝任何异常了。