2017-08-21 85 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