【问题标题】:The response "er ?" is getting intermittently for Ruby http request回应“呃?”间歇性地获得 Ruby http 请求
【发布时间】:2016-05-26 05:41:09
【问题描述】:

我正在使用 open-uri 方法运行 http 请求。以下错误消息间歇性地出现,而不是预期的输出。

发生了 NoMethodError 类型的错误,消息是 nil:NilClass 的未定义方法 `[]'

呃?

我的代码如下,

request_uri = "my url here"
request_query = ''
url = "#{request_uri}#{request_query}"

begin
  buffer = open(request_uri,
             'app-key' => ENV['API_KEY'],
             'app-token' => ENV['API_TOKEN'],
             'trail-Token' => ENV['TRAIL_TOKEN']).read
  parsed = JSON.parse(buffer)
  events = parsed['events']
  event = Array(events).last
  message = event['message']
  otp = message[-5,4]
  print "otp", otp
rescue Exception => ex
  puts "An error of type #{ex.class} happened, message is #{ex.message}"
  retry
end

puts "otp returned", otp

由于我是 ruby​​ 新手,不知道为什么会有这样的响应。一旦我下次运行脚本 er ? 时正确获得响应,就是响应。请有人帮忙解决这个问题。

【问题讨论】:

标签: ruby-on-rails ruby


【解决方案1】:

这里的开始救援块非常大,您正在丢失异常详细信息,包括行号。

实际上,在某些时候正在发生的事情是您在一个 nil 对象上调用 [],但它失败了。哪一点?如果没有堆栈跟踪或较小的块,您将无法看到。

正如@Stefan 所说,请不要捕获异常,如果您不确定会得到什么,请将其留空,ruby 会为您做最好的事情并抓住异常痕迹的正确部分,这只会让生活变得艰难,见:Why is it a bad style to `rescue Exception => e` in Ruby?

如果您想查看导致异常的确切行,我也肯定会限制重试。

begin
  retries ||= 0
  ...

rescue => ex
  puts "An error of type #{ex.class} happened, message is #{ex.message}"
  puts ex.backtrace
  retry if (retries += 1) < 3
end

【讨论】:

  • 感谢您的帮助@Luke。但即使在那之后,我也会间歇性地收到 er ? 响应。为什么会这样?
  • 为此,您需要深入研究特定错误。错误的可能原因是存在网络问题或您的 API 在 100% 的时间没有以预期格式的 json 响应。这导致错误在您的下游代码中冒泡。要获取更多信息,您需要验证您从 api 收到的输入,以确保它首先是预期的。
  • 好的。非常感谢您的指示。
猜你喜欢
  • 2011-03-13
  • 1970-01-01
  • 1970-01-01
  • 2019-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-21
  • 1970-01-01
相关资源
最近更新 更多