簡體   English   中英

寫多個嘗試,除了在python中

[英]writing multiple try and except in python

我想知道在python中編寫try .. except語句的最優雅方式是什么。 假設我有這個代碼:

with open(sys.argv[1]) as f:
    for line in f:
        try:
            do_1(line)
        except:
            pass
        try:
            do_2(line)
        except:
            pass
        try:
            do_3(line)
        except:
            pass
        ...
        ...

寫這個的最好方法是什么? 我的行為是順序的。 但是,如果do_1失敗,我仍然想執行do_2 如果所有這些都在一次try .. except阻止,那么如果do_1失敗,我將永遠不會達到do_2 這是正確的方法,還是我可以擁有一個except所有d0_i動作?

把它寫成循環很簡單:

for action in [do_1, do_2, do_3, ...]:
    try:
        action(line)
    except AppropriateExceptionType:
        pass

我會考慮你的try/except語句的公共代碼。 就像是:

def run_safely(f, *args):
    try:
        f(*args)
    except SpecificException:
        # handle appropriately here
        pass

with open(sys.argv[1]) as f:
   for line in f:
       run_safely(do_1, line)
       run_safely(do_2, line)
       run_safely(do_3, line)

基本上,你需要每個do_<Step>函數在前一個的finally塊中運行,如下所示:

try:
    do_1(line)
    except:
        # Handle failure
        pass
    finally:
        # Run regardless
        try:
            do_2(line)
        except:
            # Handle failure
        finally:
            # Run regardless
            try:
                do_3(line)
                ...

這通過finally塊將函數鏈接在一起。 請注意,如果在任何步驟發生異常,則在開始下一步之前處理異常,無論是否生成異常,都保證運行該異常。


由於你的函數都具有相同的形狀(使用相同數量和類型的參數),你可以將這個模式抽象為一個函數,如下面的tryChain

def tryChain(functions, *sharedArgs)
    f = functions.pop()
    try:
        f(*sharedArgs)
    finally:
        tryChain(functions)

try:
    tryChain([do_1, do_2, ...], line, arg2, ...)
except SpecificException:
    # Handle exception here, which may be propagated from any of the actions
    pass

請注意,在這種情況下,只有最后一個異常被拋回給調用者; 其他人都是隱藏的。 (您也可以在tryChain處理異常,並在其中插入except塊;或者,您可以為每個步驟傳入錯誤處理程序;或者從異常類型映射到相應的處理程序,如果沒有,則重新拋出錯誤他們匹配 - 但在那時,你幾乎重新發明了異常處理。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM