[英]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.