我正在向我的子商人付款,并想知道我是否可以使用递归来保证当支付给他们时,我们将数据保存到我们的DB中。
示例:
def make_payout
result = object.process_payout_through_gateway
if result.success?
payout = Payout.new
payout[:paid] = true
save_payout(payout)
end
end
def save_payout(payout)
begin
payout.save!
rescue e
save_payout(payout)
end
end发布于 2017-07-07 23:43:32
如果您想访问gaunrentee,则在不验证对象的情况下保存它:
payout.save(validate: false)
发布于 2017-07-08 00:08:48
简单的回答是no。除非错误是暂时的,否则一次又一次地重新尝试保存操作将无助于您,而且在某些情况下甚至会加剧问题。
如果期望某些错误在正常操作中经常发生,则可以选择通过重试操作来选择性地处理这些错误。这里的关键字是选择性的--如果您盲目地rescue所有的东西,您就冒着重新尝试操作的风险,即使错误是由一些您无法正常恢复的东西引起的,比如编程错误。因此,您应该始终指定希望rescue的特定异常类。
begin
payout.save!
rescue ExceptionThatHappensSometimesButIsNoBigDeal
# ignore error + maybe log it, etc.
end捕获某些异常并稍后重新尝试操作是与非关键的外部API交谈时经常使用的策略,因为这些API在任何时候都可能发生短暂的中断。如果你不忽视这些非关键的例外情况,它们就会冒出来,同时也会让你的应用程序崩溃。
然而,重试失败的操作,这些操作只触及您控制的系统(例如保存到本地数据库),通常会适得其反--如果您默默地忽略了这些错误,则可能无法及时发现这些错误。
发布于 2017-07-07 23:53:24
谢谢各位,所有的答案都很好。我个人认为:
def save_payout(payout)
begin
payout.save!
rescue e
puts "Payment to User-ID: #{current_user.id} FAILED TO SAVE! #{e}"
UserMailer.send_payout_failure_email(current_user.id).deliver_now
end
end我不会给出一个“正确”的答案,只会让每个人都站起来-投票给他们最喜欢的路线。
https://stackoverflow.com/questions/44980948
复制相似问题