假设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())
发布于 2017-08-22 02:09:55
如果异常是由任何函数调用引发的,也就是说,当参数仍在计算时,则不会调用executeFunction
。
您应该考虑传递callable,并在try/except
子句中调用它:
def executeFunction(x):
try:
x()
except SomeException:
print('Exception caught')
executeFunction(func1)
从x()
引发的任何错误现在都由封闭的try/except
子句处理。
对于带参数的函数,可以使用functools.partial
(或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))
您还可以利用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)
https://stackoverflow.com/questions/45803245
复制相似问题