我喜欢Xero会计的rails应用程序。创建发票时,我要做的第一件事就是查找要存储发票的联系人。这方面的代码非常简单,就是..
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发布于 2014-07-15 20:22:03
只需将所有依赖于contact_response的代码放入捕获的块中
exception_catcher do
contact_response = private_app.get_contact_by_id("12345")
create_invoice(contact_response)
end但是要小心。你为什么要做这个pokemon异常处理。您不应该只捕获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初始化vars即可。
contact_response = nil
exception_catcher do ... end
if contact_response
...
end如果您的应用程序在此异常发生后不应执行某些代码,请完全不要捕获它,并让此请求崩溃。配置rails,如果发生这种情况,会显示一些常规错误
发布于 2014-07-16 13:53:04
您应该将其封装起来:
contact_response = (private_app.get_contact_by_id("12345") rescue nil)https://stackoverflow.com/questions/24753844
复制相似问题