如何处理货币转换服务的超时?

时间:2015-04-24 09:02:15

标签: ruby-on-rails ruby timeout

我刚刚为我的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因某些原因而超时或不可用的(不太可能的)事件?

在这种情况下,我希望result1。如何实现这一目标?

感谢您的任何建议。

3 个答案:

答案 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