如何使用python lambdas捕获异常
假设Python版本>=3并调用函数列表。 我想编写一个处理异常的lambda函数。 问题是,它不起作用,当函数中抛出异常时,程序返回,调用堆栈没有看到其中的如何使用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
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需要返回包装器。已更新:)