如何使用python lambdas捕获异常

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)

Mos*_*oye 8

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)