我刚刚为我的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货币超时或由于某种原因不可用的(不太可能的)事件?
在这种情况下,我希望我的result
是1
的。如何实现这一点?
感谢您的任何建议。
您可以简单地挽救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
对于自定义超时操作,您可以使用Timeout
模块http://ruby-doc.org/stdlib-2.1.2/libdoc/timeout/rdoc/Timeout.html
值得看看这个答案,看看如何让野木超时: 调整野木连接的超时
该问题利用了timeout
模块,这是一个选项,但我认为最好根据接受的答案让连接超时。
所有这些都意味着,如果调用超时,您将收到一个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