首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用python lambdas捕获异常

如何使用python lambdas捕获异常
EN

Stack Overflow用户
提问于 2017-08-22 02:07:18
回答 1查看 5.1K关注 0票数 4

假设Python版本为>=3,并调用一个函数列表。我想写一个处理异常的lambda函数。问题是,它不起作用,当函数中抛出异常时,程序返回,调用堆栈看不到其中的executeFunction

该怎么做呢?

代码语言:javascript
复制
def executeFunction(x):
    try:
        x
    except:
        print('Exception caught')


executeFunction(func1())
executeFunction(func2())
executeFunction(func3())
executeFunction(func4())
executeFunction(func5())
executeFunction(func6())
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-22 02:09:55

如果异常是由任何函数调用引发的,也就是说,当参数仍在计算时,则不会调用executeFunction

您应该考虑传递callable,并在try/except子句中调用它:

代码语言:javascript
复制
def executeFunction(x):
    try:
        x()
    except SomeException:
        print('Exception caught')

executeFunction(func1)

x()引发的任何错误现在都由封闭的try/except子句处理。

对于带参数的函数,可以使用functools.partial (或lambda)通过参数延迟调用:

代码语言:javascript
复制
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,从而从调用方获得更整洁的代码:

代码语言:javascript
复制
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)
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45803245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档