【问题标题】:How to deal with timeout in currency conversion service?货币兑换服务超时如何处理?
【发布时间】:2015-07-02 19:08:41
【问题描述】:

我刚刚为我的 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 问题?

标签: ruby-on-rails ruby timeout


【解决方案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

【讨论】:

    【解决方案2】:

    看看这个答案是值得的,看看如何让 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
    

    【讨论】:

    • Nokogiri 没有超时,但 OpenURI 有。 Nokogiri 可能存在解析错误,尤其是在该 google 页面的 css 或 html 更改时。
    • 是的,我知道 nokogiri 没有这就是为什么我链接到关于调整 Nokogiri 连接超时的问题。然后我继续解释,一旦您以 超时的方式连接到 nokogiri,您就可以挽救超时错误。
    • 好的,不确定我是否可以关注你们。我用新版本更新了我的初始帖子。它旨在捕获可能出现的任何错误(包括超时和css更改),然后将结果设置为1。你认为它会起作用吗? (我不知道如何测试这个,因为到目前为止谷歌的转换服务没有任何错误。)
    【解决方案3】:

    对于自定义超时操作,您可以使用 Timeout 模块 http://ruby-doc.org/stdlib-2.1.2/libdoc/timeout/rdoc/Timeout.html

    【讨论】:

      猜你喜欢
      • 2016-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-05
      • 2012-06-10
      • 1970-01-01
      • 1970-01-01
      • 2014-12-08
      相关资源
      最近更新 更多