2017-06-12 24 views
0

示例代碼:是否可以在原子塊中捕獲Django ORM錯誤?

with transaction.atomic(): 
    # Create and save some models here 

    try: 
     model_instance.save() 
    except IntegrityError: 
     raise SomeCustomError() 

兩個問題:

1)將這項工作作爲預期並回滾任何先前保存的模型,因爲沒有什麼是除了異常處理程序完成再提高一個自定義錯誤?

2)從代碼風格的角度來看,在這種情況下,在try塊內不使用嵌套事務是否有意義? (也就是說,try語句塊中的代碼只有一條線,沒有在事務中持續別的意圖,沒有寫入異常處理程序內的數據庫等)

回答

0

您應該使用原子事務如下面的代碼。在捕獲塊中處理原子事務,避免捕獲原子內的異常。

try: 
    with transaction.atomic(): 
     SomeModel.objects.get(id=NON_EXISTENT_ID) 
except SomeModel.DoesNotExist: 
    raise SomeCustomError() 
1

將這項工作作爲預期並回滾任何先前保存的模型,因爲沒有什麼是異常處理程序做,除了重新提高自定義錯誤?

是的。回滾將由異常(任何除外)被觸發,只要你不數據庫錯誤後觸摸數據庫,你不會冒險的文件中提到的TransactionManagementError

從代碼風格的角度來看,在這種情況下不在try塊中使用嵌套事務有意義嗎?

風格是一個意見問題,但我沒有看到在這裏使用嵌套事務的任何一點。它使代碼更復雜(更不用說交易中不必要的保存點),因爲沒有明顯的好處。

+0

這對這種情況有意義。有什麼用'得到()'查詢中的東西,實際上是扔了一個數據庫錯誤取代了線? – Alex3917

+0

@ Alex3917:我已經更新了你的例子,我的答案更重要。在這個例子中,真正的問題被一個非數據庫錯誤所掩蓋。 –

相關問題