[英]Django : Propagate exception from models to a view
我有一個模型,其中包含許多方法,這些方法使用第三方調用(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
,我認為這不是放置這些塊的好地方,因為錯誤的起源在模型的方法中,而不是在視圖中。
那么ia如何處理模型中的錯誤並仍然能夠在視圖中重定向該錯誤?
為了獲得更好的一致性,我會在模型中捕獲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
解決此問題的簡單方法是簡單地捕獲異常,然后重新引發它。 這不會解決更大的問題,該問題與應用程序的組合方式有關。
您應該避免將付款邏輯與模型緊密結合; 明天,如果您必須添加其他付款提供商,您將度過一個美好的時光,將邏輯從模型中提取出來。
您應該將付款邏輯保持在您的視野之外。 您的付款視圖應處理金額和付款方式; 其他任何事情都應單獨處理,這是我的建議(高度簡化):
為您的應用程序圍繞Stripe API創建包裝器。 這將使換出Stripe或以后添加其他提供程序變得更加容易。
這個包裝器應該接受三件事:
然后,您的包裝器將使用提供者的API進行付款,並返回成功或失敗條件,以及來自提供者的任何有效負載(例如交易參考等)
您的視圖將攔截交易的結果,如果交易成功,則更新模型; 如果失敗,請再次更新模型並相應地重定向用戶。
這樣,您可以:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.