2016-10-27 20 views
1

我有一個try:finally塊必須始終執行(異常或不),除非發生特定的異常。爲了討論的方便,讓我們說這是一個ValueError,所以我問,如果我能實現:總是執行finally塊,除了一個例外

try: 
    stuff() 
except Exception as e: 
    if type(e) is ValueError: raise 
    #do important stuff 
    raise 

#do important stuff 

更優雅時尚跳過的複製粘貼#importantstuff。如果我統治的Python它看起來是這樣的:

try: 
    stuff() 
finally except ValueError: 
    #do important stuff 

在功能把#importantstuff不是一個答案,但不可能是。

+2

沒有,有沒有辦法做到這一點。 「終於」是爲了必須發生的事情。爲什麼不把「重要的東西」提取到你可以在兩個地方打電話的方法? *「不是答案,但不可能的是」*,是什麼意思? – jonrsharpe

+0

_「嘗試:finally塊必須始終執行(** exception or not **)」_ - 聽起來像你不想嘗試,除了 – IanAuld

回答

3

如果需要finally跳過在特定條件下的事情,你需要使用一個明確的標誌:

do_final_stuff = True 
try: 
    # ... 
except ValueError: 
    do_final_stuff = False 
    raise 
finally: 
    if do_final_stuff: 
     # ... 

你也可以使用一個上下文管理在這裏,事後清理。上下文管理者傳遞當前激活的異常,如果有一個:

class MyContextManager: 
    def __enter__(self): 
     return self 

    def __exit__(self, exc_type, exc_value, tb): 
     if exc_type is not ValueError: 
      # do cleanup 

with MyContextManager(): 
    # ... 
+0

上下文管理器的一個不錯的想法 – jonrsharpe

+0

兩者都更優雅,好主意,謝謝。 – kabanus

相關問題