2013-07-17 137 views
1

我清理了一些代碼,並已經運行到的地方有一試重複清除動作/情形除外一把:清理方式來處理python異常?

try: 
    ... 
except KeyError , e : 
    cleanup_a() 
    cleanup_b() 
    cleanup_c() 
    handle_keyerror() 
except ValuesError , e : 
    cleanup_a() 
    cleanup_b() 
    cleanup_c() 
    handle_valueerror() 

我想使這些多一點標準化可讀性和維護。在「清理」行動似乎是本地的塊,所以它不會是乾淨多了做以下(儘管它會規範了一點):

def _cleanup_unified(): 
    cleanup_a() 
    cleanup_b() 
    cleanup_c() 
try: 
    ... 
except KeyError , e : 
    _cleanup_unified() 
    handle_keyerror() 

except ValuesError , e : 
    _cleanup_unified() 
    handle_valueerror() 

任何人都可以提出處理這個的替代方法?

+0

我注意到,有一些實際上是回答兩個不同的問題非常良好的反應。也許可以添加一些說明你正在尋找什麼? – SethMMorton

回答

1

您可以通過捕獲所有的人在同一除了和測試類型這樣differenciate錯誤:

try: 
    ... 
except (KeyError, ValuesError) as e : 
    cleanup_a() 
    cleanup_b() 
    cleanup_c() 
    if type(e) is KeyError: 
     handle_keyerror() 
    else: 
     handle_valueerror() 
+0

多數民衆贊成在一個好主意。如果isinstance(e,types.KeyError):'會更好 –

1

如果清除總是可以運行,你可以使用finally子句,它運行的是否引發異常與否:

try: 
    do_something() 
except: 
    handle_exception() 
finally: 
    do_cleanup() 

如果清除應該可以在異常的情況下運行,這樣的事情可能工作:

should_cleanup = True 
try: 
    do_something() 
    should_cleanup = False 
except: 
    handle_exception() 
finally: 
    if should_cleanup(): 
    do_cleanup() 
+0

我想過你的第二個選擇(用'should_cleanup'標誌,它看起來不太可讀,長期來看 –

0

如果except塊始終是相同的,你可以寫:

try: 
    ... 
except (KeyError, ValueError) , e : 
    cleanup_a() 
    cleanup_b() 
    cleanup_c() 
    handle_keyerror() 
+1

不同之處在於handle_keyerror和handle_valueerror,except塊不一樣 – njzk2