如何处理货币兑换服务中的超时



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

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

感谢您的任何建议。

您可以简单地挽救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

最新更新