jpw*_*ynn 4 ruby error-handling timeout open-uri
只要没有远程错误,当前代码就可以工作:
def get_name_from_remote_url
cstr = "http://someurl.com"
getresult = open(cstr, "UserAgent" => "Ruby-OpenURI").read
doc = Nokogiri::XML(getresult)
my_data = doc.xpath("/session/name").text
# => 'Fred' or 'Sam' etc
return my_data
end
Run Code Online (Sandbox Code Playgroud)
但是,如果远程URL超时或什么都不返回怎么办?例如,我如何检测到并返回nil?
而且,Open-URI是否提供了一种方法来定义放弃前等待的时间?当用户等待响应时调用此方法,那么我们如何在放弃之前设置最大timeoput时间并告诉用户"抱歉我们尝试访问的远程服务器现在不可用"?
Open-URI很方便,但这种易用性意味着它们可以删除对Net :: HTTP允许的其他HTTP客户端的许多配置细节的访问.
这取决于您使用的Ruby版本.对于1.8.7,您可以使用Timeout模块.来自文档:
require 'timeout'
begin
status = Timeout::timeout(5) {
getresult = open(cstr, "UserAgent" => "Ruby-OpenURI").read
}
rescue Timeout::Error => e
puts e.to_s
end
Run Code Online (Sandbox Code Playgroud)
然后检查getresult的长度,看看你是否有任何内容:
if (getresult.empty?)
puts "got nothing from url"
end
Run Code Online (Sandbox Code Playgroud)
如果您使用的是Ruby 1.9.2,则可以:read_timeout => 10为该open()方法添加一个选项.
此外,您的代码可以收紧并使其更加灵活.这将允许您传入URL或默认为当前使用的URL.还可以阅读引入nokogiri的节点集文档理解之间的区别xpath,/,css和at,%,at_css,at_xpath:
def get_name_from_remote_url(cstr = 'http://someurl.com')
doc = Nokogiri::XML(open(cstr, 'UserAgent' => 'Ruby-OpenURI'))
# xpath returns a nodeset which has to be iterated over
# my_data = doc.xpath('/session/name').text # => 'Fred' or 'Sam' etc
# at returns a single node
doc.at('/session/name').text
end
Run Code Online (Sandbox Code Playgroud)