Ruby on rails 西德基。如何捕捉生产中的错误?

Ruby on rails 西德基。如何捕捉生产中的错误?,ruby-on-rails,sidekiq,Ruby On Rails,Sidekiq,我有几个工人在日志中没有错误。但生产中的同一代码有时会显示错误。这并不重要,但我想了解区别是什么,以及如何捕获和修复错误。此处显示部分日志,其中有错误: 2016-01-18T16:34:10.725Z 535 TID-otb5ze3fo TopUpdateWorker JID-73c584ed6fec322784d67796 INFO: start 2016-01-18T16:34:10.725Z 535 TID-otb5ze3fo TopUpdateWorker JID-73c584ed6f

我有几个工人在日志中没有错误。但生产中的同一代码有时会显示错误。这并不重要,但我想了解区别是什么,以及如何捕获和修复错误。此处显示部分日志,其中有错误:

2016-01-18T16:34:10.725Z 535 TID-otb5ze3fo TopUpdateWorker JID-73c584ed6fec322784d67796 INFO: start
2016-01-18T16:34:10.725Z 535 TID-otb5ze3fo TopUpdateWorker JID-73c584ed6fec322784d67796 INFO: Things are happening.
2016-01-18T16:34:10.824Z 535 TID-otb5ze3fo TopUpdateWorker JID-73c584ed6fec322784d67796 INFO: fail: 0.099 sec
2016-01-18T16:34:10.824Z 535 TID-otb5ze3fo WARN: {"class"=>"TopUpdateWorker", "args"=>[], "retry"=>3, "queue"=>"default", "jid"=>"73c584ed6fec322784d67796", "created_at"=>1453134850.724368, "enqueued_at"=$
2016-01-18T16:34:10.824Z 535 TID-otb5ze3fo WARN: TypeError: no implicit conversion of nil into Array
2016-01-18T16:34:10.824Z 535 TID-otb5ze3fo WARN: /var/www/vkgazer/code/lib/modules/common_mods.rb:27:in `+'
/var/www/vkgazer/code/lib/modules/common_mods.rb:27:in `get_request'
/var/www/vkgazer/code/app/models/post.rb:170:in `top_post_updater'
/var/www/vkgazer/code/app/workers/top_update_worker.rb:9:in `perform'
/var/www/vkgazer/code/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.0.1/lib/sidekiq/processor.rb:150:in `execute_job'
/var/www/vkgazer/code/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.0.1/lib/sidekiq/processor.rb:132:in `block (2 levels) in process'
/var/www/vkgazer/code/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.0.1/lib/sidekiq/middleware/chain.rb:127:in `block in invoke'
/var/www/vkgazer/code/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.0.1/lib/sidekiq/middleware/server/active_record.rb:6:in `call'
/var/www/vkgazer/code/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.0.1/lib/sidekiq/middleware/chain.rb:129:in `block in invoke'
/var/www/vkgazer/code/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.0.1/lib/sidekiq/middleware/server/retry_jobs.rb:74:in `call'
/var/www/vkgazer/code/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.0.1/lib/sidekiq/middleware/chain.rb:129:in `block in invoke'
/var/www/vkgazer/code/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.0.1/lib/sidekiq/middleware/server/logging.rb:11:in `block in call'
/var/www/vkgazer/code/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.0.1/lib/sidekiq/logging.rb:30:in `with_context'
/var/www/vkgazer/code/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.0.1/lib/sidekiq/middleware/server/logging.rb:7:in `call'
/var/www/vkgazer/code/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.0.1/lib/sidekiq/middleware/chain.rb:129:in `block in invoke'
/var/www/vkgazer/code/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.0.1/lib/sidekiq/middleware/chain.rb:132:in `call'
/var/www/vkgazer/code/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.0.1/lib/sidekiq/middleware/chain.rb:132:in `invoke'
/var/www/vkgazer/code/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.0.1/lib/sidekiq/processor.rb:127:in `block in process'
/var/www/vkgazer/code/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.0.1/lib/sidekiq/processor.rb:166:in `stats'
/var/www/vkgazer/code/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.0.1/lib/sidekiq/processor.rb:126:in `process'
/var/www/vkgazer/code/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.0.1/lib/sidekiq/processor.rb:79:in `process_one'
/var/www/vkgazer/code/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.0.1/lib/sidekiq/processor.rb:67:in `run'
/var/www/vkgazer/code/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.0.1/lib/sidekiq/util.rb:16:in `watchdog'
/var/www/vkgazer/code/vendor/bundle/ruby/2.2.0/gems/sidekiq-4.0.1/lib/sidekiq/util.rb:24:in `block in safe_thread'
错误总是在这个字符串中。代码如下:

 def get_request(code) #
    i = 0
    result = []
    while i < code.size #
      part_code = code.slice(i, 25)
      if part_code.size >1
        str_code = part_code.join(',')
      else
        str_code = part_code[0]
      end
      url='https://api.x.com/method/execute'
      uri = URI.parse(url)
      parameters =  {'access_token' => '00',
                    'code' => "return [#{str_code}];", 'v' => '2'}
      response = Net::HTTP.post_form(uri, parameters) # 
      result = result + JSON.parse(response.body)['response'] #here is error
      i += 25
      sleep 0.35
    end
    result #
  end
def get_请求(代码)#
i=0
结果=[]
而我'00',
'code'=>“return[#{stru code}];”,'v'=>“2'}
response=Net::HTTP.post_表单(uri,参数)#
result=result+JSON.parse(response.body)['response']#这里是错误
i+=25
睡眠0.35
结束
结果#
结束

在这里,我向API发送请求,并将所有响应相加。还有一件事,在开发阶段,我的工作持续时间不到10秒,但在生产阶段可以是160秒。我的计算机比服务器更好?

所以任何时候你的
响应.body
包含一个“空”响应,比如
“{}”
或者如果它只是缺少
'response'
元素,那么
JSON.parse(response.body)['response']
将是
nil
,因此你的代码试图做到:

result + nil
…你会犯这个错误。也许最好的解决办法是这样:

result = result + ( JSON.parse(response.body)['response'] || [] )

这是由于
JSON.parse(response.body)['response']
为零造成的。简而言之,响应是正确的JSON,但上面没有响应字段。现在,修复取决于您在这种情况下想做什么。@BroiSatse肯定您是对的,但为什么它只发生在生产中?从IP黑名单开始,有上千种可能的原因。您需要记录响应本身,它应该包含发生的原因的线索(类似于
{“error”:“我不喜欢您”}
)。这完全取决于您向哪个服务发送请求。@BroiSatse谢谢,这是非常有用的评论。我不知道如何记录,但我会学习的。