改进try-catch python方法

时间:2014-06-11 17:04:43

标签: python-2.7

我基本上试图通过一些功能改进Python: try-except as an Expression?

  • 能够将额外的args和kwargs传递给" try-except"题。这是因为我有一个成功函数,它接受一些参数
  • 如果应该使用exception参数调用callable的失败函数,那么它就有机会处理它。

以下是带有测试的示例代码,但是我无法让最后一行工作

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,然后检查列表中是否有异常类,如果不是,则重新抛出它。然而,这不会起作用,因为当我重新抛出原始堆栈跟踪丢失时,我不想这样做。

1 个答案:

答案 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子句,将计算该表达式,如果结果对象与异常“兼容”,则子句匹配异常。如果对象是异常对象的类或基类,或者包含与异常兼容的项的元组,则该对象与异常兼容。