python - 如何使用 python lambdas 捕获异常

标签 python exception lambda 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())

最佳答案

如果任何函数调用引发异常,则不会调用

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)

关于python - 如何使用 python lambdas 捕获异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45803245/

相关文章:

c# - 在 C# 中组合 BinaryExpression 和 Expression<Func<dynamic, bool>>

python - 使用 cmp 在 Python 中排序()

c# - Linq - 从基于 "weight"和 "order"的列表中获取项目

python - 值错误: The shape of all parameters

python - 在 Python 中展平字符串列表以及字符串列表和列表

c# - 在 Visual Studio 中捕获整数溢出异常

java - 应为 BEGIN_OBJECT 但实际为 BEGIN_ARRAY

c++ - 如何在不期望的情况下处理方法中的 nullptr?

python - 如何从 SQLAlchemy 关系子表中删除所有行?

python - 从字符串列表中删除引号(应该是元组)