我基本上试图通过一些功能改进Python: try-except as an Expression?
以下是带有测试的示例代码,但是我无法让最后一行工作
def method2(exc_class = None):
if exc_class:
raise exc_class()
def method1():
return "Hello world"
def try_except(function, failure, exceptions = [], args = [], kwargs = {}):
"""
Run the given function with args and kwargs. If it throws one of the
exceptions in the list then either return failure or call failure function
"""
try:
return function(*args, **kwargs)
except exceptions or Exception as e:
return failure(e) if callable(failure) else failure
if __name__ == "__main__":
#Prints hello world
print try_except(method1, "Failure")
#Prints Failure great!!
print try_except(method2, "Failure", kwargs = {"exc_class" : ValueError})
# I expect below line to print "Failure" properly but it throws a ValueError
print try_except(method2, "Failure", kwargs = {"exc_class" : ValueError}, exceptions=[ValueError])
我的问题是except exceptions or Exception as e:
行不能正确替换例外列表。我不能做原始问题中显示的*异常,因为我想为函数接受额外的参数。
我可以在某种程度上改变try_except。
注意:我已经考虑过捕获所有except Exception as e
,然后检查列表中是否有异常类,如果不是,则重新抛出它。然而,这不会起作用,因为当我重新抛出原始堆栈跟踪丢失时,我不想这样做。
答案 0 :(得分:2)
使用一个except
子句捕获多个异常类型时,不能只使用任何可迭代对象;你必须专门使用tuple
。您仍然可以通过在try_except
子句本身中创建元组来允许except
将任何可迭代作为参数。
try:
return function(*args, **kwargs)
except tuple(exceptions or (Exception,)) as e:
return failure(e) if callable(failure) else failure
来自the docs:
对于带有表达式的except子句,将计算该表达式,如果结果对象与异常“兼容”,则子句匹配异常。如果对象是异常对象的类或基类,或者包含与异常兼容的项的元组,则该对象与异常兼容。