2017-01-08 27 views
-1
try : 
    doSomething1() 
    doSomething2() 
    doSomething3() 
except Exception as e : 
    doSomething4() 
} 

我知道在上面的代碼中如果doSomething1()失敗doSomething2() & doSomething3()將不會執行,它會跳轉到doSomething4()
但我想要的東西在那裏,如果在任的doSomething1() or doSomething2() or doSomething2()失敗,整個try不被執行,並跳轉到doSomething4()
其實我有一個數據庫,並在try創建兩行,但有時第二行失敗,第一個工作不,但我不希望第二行失敗時保存第一行。我希望他們兩個一起執行或失敗。怎麼樣?如何僅執行如果try中的所有語句都不失敗?

+6

如果您在數據庫上工作,您不能使用事務並回滾出錯嗎? – Lucero

+1

是的,這聽起來像你需要交易行爲。您應該使用數據庫驅動程序中提供的工具來執行此操作,而不是使用天真的Python錯誤處理。 – jonrsharpe

+1

Python無法及時回溯。一旦完成,它不能自動撤消。 – Barmar

回答

0

你想,如果有任何的doSomething1doSomething2doSomething3方法的失敗,則try塊被跳過,並且運行doSomething4方法。

那麼,這在邏輯上是不可能的。如果doSomething1失敗,則它已執行,因此整個try不能完全跳過。 doSomething2相同:如果失敗,則已運行,並且doSomething1未失敗,因此只能跳過doSomething3

以下是您可以實施的幾種不同行爲。

行爲1

try: 
    doSomething1() 
    doSomething2() 
    doSomething3() 
except: 
    doSomething4() 

嘗試運行doSomething1doSomething2doSomething3。如果其中一個失敗,則跳過以下幾項,並執行doSomething4。否則,跳過doSomething4

行爲2

try: 
    doSomething1() 
    doSomething2() 
    doSomething3() 
finally: 
    doSomething4() 

嘗試運行doSomething1doSomething2doSomething3。如果其中一個失敗,則跳過以下幾個。無論如何,doSomething4在最後執行。

行爲3

try: 
    doSomething1() 
except: 
    try: 
     doSomething2() 
    except: 
     pass 
    else: 
     try: 
      doSomething3() 
     except: 
      pass 
     else: 
      doSomething4() 
else: 
    try: 
     doSomething2() 
    except: 
     try: 
      doSomething3() 
     except: 
      pass 
     else: 
      doSomething4() 
    else: 
     try: 
      doSomething3() 
     except: 
      doSomething4() 

如果正好doSomething1doSomething2doSomething3失敗,doSomething4一個運行。這種行爲可以通過更簡單的方式用更簡單的異常管理來實現,但此代碼的優點是僅使用try s,except s和else s。

行爲4

這是對應於你的問題的標題。如果doSomething1,doSomething2doSomething3均未失敗,則運行doSomething4;否則,它不會運行。