我喜欢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
答案 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)