首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >rails捕获超时错误

rails捕获超时错误
EN

Stack Overflow用户
提问于 2014-07-15 16:54:33
回答 2查看 75关注 0票数 0

我喜欢Xero会计的rails应用程序。创建发票时,我要做的第一件事就是查找要存储发票的联系人。这方面的代码非常简单,就是..

代码语言:javascript
复制
private_app = XeroGatewayProvider.new.create_private_app    
contact_response = private_app.get_contact_by_id("12345")

其中"12345“是Xero账户中的唯一ID。现在,我只知道该联系人很快就会从xero中消失,或者因为某种原因找不到它,所以我想围绕这一点编写代码,并阻止代码尝试为不存在的联系人创建发票。现在,如果我运行缺少ID的代码,它实际上会崩溃并出现错误,如下所示

代码语言:javascript
复制
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'

显然,我不能让应用程序崩溃,所以我从应用程序的其他地方借用了一些代码来捕获错误,这就是……

代码语言:javascript
复制
  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

所以现在代码变成了

代码语言:javascript
复制
# 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

好了,到目前为止一切正常,代码现在可以执行了,如果找不到人,它就会继续运行,而不会导致应用程序崩溃。这是问题所在。我想要做的是阻止应用程序继续尝试创建发票,如果没有联系响应。所以就像这样

代码语言:javascript
复制
unless contact_response.nil
  go off and create an invoice
end

问题是,如果contact_response出错,它实际上并不存在。我已经尝试过像这样的救援

代码语言:javascript
复制
contact_response = private_app.get_contact_by_id("12345")  rescue nil

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

代码语言:javascript
复制
NameError: undefined local variable or method `contact_response'

帮助!

编辑:

好的,这行得通,这是一个明智的解决方案吗……

代码语言:javascript
复制
unless (defined?(contact_response)).nil?
  go off and create the invoice
end
EN

回答 2

Stack Overflow用户

发布于 2014-07-15 20:22:03

只需将所有依赖于contact_response的代码放入捕获的块中

代码语言:javascript
复制
exception_catcher do
  contact_response = private_app.get_contact_by_id("12345")
  create_invoice(contact_response)
end

但是要小心。你为什么要做这个pokemon异常处理。您不应该只捕获XeroGateway::ObjectNotFound异常吗

代码语言:javascript
复制
begin 
  contact_response = private_app.get_contact_by_id("12345")
  create_invoice(contact_response)
rescue XeroGateway::ObjectNotFound => err
  #log stuff 
end

此外,检查已定义的var也有些难看。如果您不能更改仅将异常处理作为单个检查的代码,则只需使用nil初始化vars即可。

代码语言:javascript
复制
contact_response = nil
exception_catcher do ... end
if contact_response
  ...
end

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

票数 0
EN

Stack Overflow用户

发布于 2014-07-16 13:53:04

您应该将其封装起来:

代码语言:javascript
复制
contact_response = (private_app.get_contact_by_id("12345") rescue nil)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24753844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档