Rem*_*ems 2 python lambda exception try-catch
假设Python版本> = 3并调用函数列表.我想编写一个处理异常的lambda函数.事实是,它不起作用,当函数抛出异常时,程序返回并且调用堆栈没有看到executeFunction它.
怎么办?
def executeFunction(x):
try:
x
except:
print('Exception caught')
executeFunction(func1())
executeFunction(func2())
executeFunction(func3())
executeFunction(func4())
executeFunction(func5())
executeFunction(func6())
Run Code Online (Sandbox Code Playgroud)
executeFunction 如果任何函数调用引发异常,即在仍在评估参数时,将不会调用.
你应该考虑传递callable而在try/except子句中调用它:
def executeFunction(x):
try:
x()
except SomeException:
print('Exception caught')
executeFunction(func1)
Run Code Online (Sandbox Code Playgroud)
引发的任何错误x()现在由封闭try/except条款处理.
对于带参数的函数,您可以使用functools.partial(或a lambda)使用参数来推迟调用:
from functools import partial
def executeFunction(x):
try:
x()
except SomeException:
print('Exception caught')
executeFunction(partial(func1, arg1, argn))
# executeFunction(lambda: func1(arg1, argn))
Run Code Online (Sandbox Code Playgroud)
您还可以利用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)
Run Code Online (Sandbox Code Playgroud)