rails捕获超时错误

时间:2014-07-15 08:54:33

标签: ruby-on-rails ruby

我喜欢rails应用程序到Xero会计。创建发票时,我要做的第一件事就是去寻找发票将要存储的联系人。这个代码很简单,就是......

private_app = XeroGatewayProvider.new.create_private_app    
contact_response = private_app.get_contact_by_id("12345")

其中" 12345"是Xero帐户中的唯一ID。现在,我只是知道很快以后,xero就会丢失联系人,或者无论出于什么原因它都无法找到它,所以我想围绕它编写代码,并阻止代码尝试创建一个发票。联系不存在。现在,如果我运行缺少ID的代码,它实际上会因错误而崩溃,如

XeroGateway::ObjectNotFound (Couldn't find object for API Endpoint https://api.xero.com/api.xro/2.0/Contacts/12345?contactID=12345):
  app/controllers/saas_admin/hr_partners_controller.rb:102:in `send_to_xero'
显然,我无法让应用程序崩溃,所以我从应用程序的其他地方借用了一些代码来捕获错误,这就是......

  def exception_catcher
    begin
      yield
    rescue Exception => err
      # puts "\nException in saas billing: \n#{err.message}\n\t#{err.backtrace.join("\n\t")}\n"
      Rails.logger.error("\nException in saas billing: \n#{err.message}\n\t#{err.backtrace.join("\n\t")}\n")
    end
  end

所以现在代码变成了

# catch errors
 def exception_catcher
   begin
     yield
   rescue Exception => err
     # puts "\nException in saas billing: \n#{err.message}\n\t#{err.backtrace.join("\n\t")}\n"
     Rails.logger.error("\nException in saas billing: \n#{err.message}\n\t#{err.backtrace.join("\n\t")}\n")
   end
 end

# fetch person record
private_app = XeroGatewayProvider.new.create_private_app    
exception_catcher do
  contact_response = private_app.get_contact_by_id("12345")
end

好的,到目前为止一切顺利,代码现在执行了,如果它找不到一个人继续运行而不会崩溃应用程序。这是问题所在。我想做的是,如果没有联系回复,请停止尝试创建发票。像

这样的东西
unless contact_response.nil
  go off and create an invoice
end

问题是如果contact_response出错,它实际上并不存在。我试过像

那样进行救援
contact_response = private_app.get_contact_by_id("12345")  rescue nil

我还尝试检查contact_response是否存在或已定义,但它总是报告

NameError: undefined local variable or method `contact_response'

帮助!

编辑:

好的,这是有效的,这是一个明智的解决方案......

unless (defined?(contact_response)).nil?
  go off and create the invoice
end

2 个答案:

答案 0 :(得分:0)

将所有依赖于contact_response的代码放入catched块

exception_catcher do
  contact_response = private_app.get_contact_by_id("12345")
  create_invoice(contact_response)
end

但要小心。你为什么要做这个口袋妖怪异常处理。你不应该只抓住XeroGateway::ObjectNotFound异常

begin 
  contact_response = private_app.get_contact_by_id("12345")
  create_invoice(contact_response)
rescue XeroGateway::ObjectNotFound => err
  #log stuff 
end

同样检查已定义的var有点难看。如果您不能将仅具有异常处理的代码更改为单个检查,则只需使用nil初始化变量。

contact_response = nil
exception_catcher do ... end
if contact_response
  ...
end

如果您的应用程序在发生此异常后不应执行某些代码,则根本不要捕获它并让此请求崩溃。配置rails,显示一些常见错误,如果发生这种情况

答案 1 :(得分:0)

你应该把它括起来:

contact_response = (private_app.get_contact_by_id("12345") rescue nil)