我有一个拥有多种方法的模型,这些方法使用第三方调用(Stripe),这可能会产生一些错误。
在我处理该错误的模型中:
class Plan(models.Model):
def update():
try:
// get the customer data related to id "xyz"
except StipeError as error_obj:
return error_message
在视图中,我在Plan
实例
我更喜欢将try-catch放在视图中但不抓住StriprError
,它会被模型捕获。
因此,在模型和后续视图中处理错误的想法是:
def plan_view(request):
.....
try:
plan.update()
except:
//redirect with exception message
一种方法是在视图中放置try-catch块并在那里处理StripeError
,我认为这不是放置这些块的好地方,因为错误的起源在模型中#39;方法,不在视野中。
那么如何处理模型中的错误并仍能在视图中重定向该错误?
答案 0 :(得分:0)
为了更好的一致性,我会在模型中捕获StipeError,并在模型中引发另一个适当的异常,plan_view(..)可以捕获它。这样,视图就可以不知道模型内部的任何花哨业务。
class Plan(models.Model):
def update():
try:
// get the customer data related to id "xyz"
except StipeError as error_obj:
raise UpdateException() # define the exception outside of the model
...
def plan_view(request):
.....
try:
plan.update()
except UpdateException:
//redirect with exception message
答案 1 :(得分:0)
解决此问题的简单方法是简单地捕获异常,然后再次重新提升它。这无法解决与应用程序组合方式有关的更大问题。
您应避免将支付逻辑与您的模型紧密耦合;明天,如果你必须添加另一个支付提供商,你将有一个美好的时间从你的模型中提取逻辑。
您应该将您的付款逻辑保留在您的观点之外。您的付款方式视图应处理金额和付款方式;其他任何事情都应该单独处理,这是我的建议(高度简化):
为您的应用程序创建Stripe API的包装器。这样可以更轻松地更换Stripe或稍后添加其他提供程序。
这个包装器应该接受三件事:
然后,您的包装器将使用提供者的API启动付款并返回成功或失败条件,以及来自提供者的任何有效负载(如交易参考等)
您的视图将拦截交易结果,如果成功 - 更新您的模型;如果失败,请再次更新模型并相应地重定向用户。
这样你就有了: