如何使用python lambdas捕获异常

如何使用python lambdas捕获异常,python,exception,lambda,try-catch,Python,Exception,Lambda,Try Catch,假设Python版本>=3并调用函数列表。 我想编写一个处理异常的lambda函数。 问题是,它不起作用,当函数中抛出异常时,程序返回,调用堆栈没有看到其中的executeFunction 如何做到这一点 def executeFunction(x): try: x except: print('Exception caught') executeFunction(func1()) executeFunction(func2()) execut

假设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

你应该考虑传递可调用,并在代码中调用它。尝试/除< /代码>子句:

def executeFunction(x):
    try:
        x()
    except SomeException:
        print('Exception caught')

executeFunction(func1)
x()
引发的任何错误现在都由包含的
try/except
子句处理

对于具有参数的函数,您可以使用(或
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的decorator语法直接使用对函数本身的调用,而无需直接显式调用
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)

简而言之,您无法真正处理表达式内部的异常

一个较长的答案是:你可以通过使用一些人为的技巧来实现你想要的。当然,您不应该出于严肃的目的这样做,但您在表达式中实际可以做的是:

  • 通过使用
    type()
    setattr()
    的巧妙组合来定义“动态”新异常,如下所示:

      MyException = (lambda o:
                        setattr(o, '__init__',
                            lambda self: setattr(self,"test", 42))
                     or setattr(o, 'my_funny_method', lambda self:True)
                     or setattr(o, 'my_other_funny_method', lambda self:False)
                     or o)(type("MyException", (BaseException,), {}))
      e = MyException()
      print(type(e), "with attribute test =", e.test)
      print(e.my_funny_method())
      raise e
    
  • 提出任何例外情况;不仅通过执行临时操作,还可以在需要时以更一般的方式:

      (_ for _ in ()).throw(ZeroDivisionError("Hello World"))
    
  • 通过巧妙地使用特殊功能捕捉一些异常,例如迭代器处理
    StopIteration
    的方式:

      is_odd = lambda n: ((lambda l:
          (l and l.pop()) or "An exception was caught")
            (list((lambda: (yield from (n if n%2
               else (_ for _ in ()).throw(StopIteration) for _ in (None,))))())))
      print(is_odd(5))
      print(is_odd(8))
    

有关它的更多信息,请访问。

对于带参数的函数,是否有比以下更简洁的方法添加它:def executeFunction(x,arg1=“”,arg2=“”):if arg1!=“”和arg2!=“”:x(arg1,arg2)elif arg1!=“”:x(arg1)else:x()除了:print('Exception capture in'+x.\u________)谢谢它太完美了!我尝试使用包装器,但它仍然得到我:TypeError:“NoneType”对象不可调用def executeFunction(func):def wrapper(*args,**kwargs):try:func(*args,**kwargs)除了:在executeFunction def func1(arg1,arg2)处打印('hello'):在executeFunction def func2处打印('hello')(arg1):print('hello')不得不在@Moses这里的评论中用@替换@Koledoye@Rems需要返回包装器。已更新:)