我有一個主函式,它接收一個串列引數并對串列中的每個元素進行處理。我沒有必要在某個元素引發例外時停止程式。問題是,輸入串列是通過不同的函式傳遞的,要處理所有這些函式的例外是一件很痛苦的事情。
當串列中的當前元素引發例外時,是否有辦法繼續進行下一個元素的處理?
一些偽代碼:
def main(list_) -> None:
func1(list_)
func2(list_)
func3(list_)
預期行為:
def main(list_) -> None:
try:
func1(list_)
func2(list_)
func3(list_)
except:
繼續 用下一個元素
print(Element i raise Exception..., Skipping i...)
uj5u.com熱心網友回復:
有了一個 "反轉 "的函式串列,這個while-loop可能適合用于主函式的主體:
funcs = [funcN, funcN-1, ..., func2, func1]
while any(funcs)。
try: funcs.pop()(list_)
except: continue: funcs.pop()(list_).
uj5u.com熱心網友回復:
每個函式都需要放在自己的try塊中。
def main(list_) -> None:
for f in (func1, func2, func3)。
try:
f(list_)
except Exception as e:
print(e)
uj5u.com熱心網友回復:
如果你的所有函式都有相同的輸入list_,其他的答案應該是足夠的,并且由于簡單而更受歡迎。但是,如果引數不同,你可能想把對這些函式的呼叫包在一個裝飾器中,在那里你可以捕捉到錯誤:
樣式1
def catch_exc(func, *args, **kwargs)。
try:
func(*args, **kwargs)
except 例外 as error。
print(func, "Element i raise Exception..., Skipping i..."/span>, error)
else:
print(func, "Success")
def func1(list_)。raise Exception("Anything")
def func2(list_)。raise Exception("Something")
def func3(list_)。return "Success"
def func4(list_)。raise Exception("Whatever")
def main(list_) -> None:
catch_exc(func1, list_)
catch_exc(func2, list_)
catch_exc(func3, list_)
catch_exc(func4, list_)
main([1,2,3,4] )
樣式2
def catch_exc(func)。
def wrapper(*args, **kwargs) 。 # 最好用<functools.wraps(func)>來裝飾它。
try:
func(*args, **kwargs)
except 例外 as error。
print(func, "Element i raise Exception..., Skipping i..."/span>, error)
else:
print(func, "Success")
return wrapper
@catch_exc
def func1(list_)。raise Exception("Anything")
@catch_exc
def func2(list_)。raise Exception("Something")
@catch_exc
def func3(list_)。return "Success"
@catch_exc
def func4(list_)。raise Exception("Whatever")
def main(list_) -> None:
func1(list_)
func2(list_)
func3(list_)
func4(list_)
main([1,2,3,4] )
輸出
<function func1 at 0x149f3d911c10> Element i raise Exception..., Skipping i... 任何東西
<function func2 at 0x149f3d911ee0> Element i raise Exception..., Skipping i... 東西
<函式 func3 at 0x149f3d911f70> 成功
<function func4 at 0x149f3d91b040> Element i raise Exception..., Skipping I... 例外
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/332613.html
標籤:
