我刚刚为我的Rails 4应用创建了这个小货币转换器:
module Currency
def self.get_exchange_rate(from_curr = "EUR", to_curr = "USD")
if from_curr == to_curr
result = 1
else
begin
amount = 1
url = "http://www.google.com/finance/converter?a=#{amount}&from=#{from_curr}&to=#{to_curr}"
doc = Nokogiri::HTML(open(url))
result_span = doc.css('span.bld').text
result = result_span.tr('^0-9.', '')
rescue => e
puts e
result = 1
end
end
result
end
end
我没有这么做,所以我的问题是:我如何处理Google Currency因某些原因而超时或不可用的(不太可能的)事件?
在这种情况下,我希望result
为1
。如何实现这一目标?
感谢您的任何建议。
答案 0 :(得分:2)
你可以简单地拯救Nokogiri可能引发的任何错误(或OpenURI):
require 'nokogiri'
require 'open-uri'
def currency(a)
Nokogiri::HTML(open(a))
rescue => e
puts e
1 # default value when error is raised
end
puts currency('https://www.somedomainthatdoesntexist.com')
这将打印错误的回溯,然后返回数字1
getaddrinfo: nodename nor servname provided, or not known
1
答案 1 :(得分:2)
对于自定义超时操作,您可以使用Timeout
模块
http://ruby-doc.org/stdlib-2.1.2/libdoc/timeout/rdoc/Timeout.html
答案 2 :(得分:0)
值得看看这个答案,看看如何让nokogiri超时:Adjusting timeouts for Nokogiri connections
这个问题使用了timeout
module这是一个选项,但我认为最好根据接受的答案让连接超时。
所有这些意味着如果您需要处理的呼叫超时,您将获得Timeout::Error
异常:
begin
doc = ... use nokogiri ...
result_span = doc.css('span.bld').text
result = result_span.tr('^0-9.', '')
rescue Timeout::Error
result = 1
end
result