2017-08-21 129 views
1

假設Python版本> = 3並調用函數列表。 我想編寫一個處理異常的lambda函數。 問題是,它不起作用,當函數拋出異常時,程序返回並且調用堆棧沒有看到其中的executeFunction如何使用python lambda捕獲異常

如何做?如果異常是由任何函數調用提出

def executeFunction(x): 
    try: 
     x 
    except: 
     print('Exception caught') 


executeFunction(func1()) 
executeFunction(func2()) 
executeFunction(func3()) 
executeFunction(func4()) 
executeFunction(func5()) 
executeFunction(func6()) 

回答

7

executeFunction不會被調用,也就是說,當參數還有待評估。

你應該考慮傳遞調用來代替,而稱其爲try/except子句中:

def executeFunction(x): 
    try: 
     x() 
    except SomeException: 
     print('Exception caught') 

executeFunction(func1) 

x()提出的任何錯誤,現在由封閉try/except條款處理。

對於參數的函數可以使用functools.partial(或lambda)使用參數推遲電話:

你也可以利用Python的裝飾語法使用調用函數本身直接,而無需明確呼叫executeFunction直接從主叫方的側給予更清潔代碼:

def executeFunction(func): 
    def wrapper(*args, **kwargs): 
     try: 
      func(*args, **kwargs) 
     except SomeException: 
      print('Exception caught') 
    return wrapper 

@executeFunction 
def func1(arg1, arg2): 
    ... 
@executeFunction 
def func2(arg1): 
    ... 


func1(arg1, arg2) # -> executeFunction(func1)(arg1, arg2) 
func2(arg1)  # -> executeFunction(func2)(arg1) 
+0

對於參數的函數,有沒有辦法來添加我噸清潔比: DEF ExecuteFunction來(X,ARG1 = 「」,ARG2 = 「」)! 「!和ARG2 =」 如果ARG1 = 「」: X(ARG1,ARG2) elif的ARG1 = 「」 : x(arg1) else: x() 除外: print('Exception Caught in'+ x .__ name__) – Rems

+0

@Rems我已更新答案。 –

+0

非常感謝! – Rems