在一般情况下,捕获错误参数异常

buk*_*zor 5 python exception try-catch decorator

我想捕获一个异常,但前提是它来自下一级逻辑.

目的是处理由错误数量的参数调用函数的行为引起的错误,而不掩盖函数实现生成的错误.

我该如何实现以下wrong_arguments功能?

例:

try:
    return myfunc(*args)
except TypeError, error:
    #possibly wrong number of arguments
    #we know how to proceed if the error occurred when calling myfunc(), 
    #but we shouldn't interfere with errors in the implementation of myfunc
    if wrong_arguments(error, myfunc):
        return fixit()
    else:
        raise
Run Code Online (Sandbox Code Playgroud)

附录:

在简单的情况下,有几种解决方案可以很好地工作,但是当前的答案都不适用于装饰函数的真实情况.

考虑一下这些是myfunc上面可能的值:

def decorator(func):
    "The most trivial (and common) decorator"
    def wrapper(*args, **kwargs):
        return func(*args, **kwargs)

def myfunc1(a, b, c='ok'):
    return (a, b, c)

myfunc2 = decorator(myfunc1)
myfunc3 = decorator(myfunc2)
Run Code Online (Sandbox Code Playgroud)

即使是保守的前瞻性跳跃方法(检查函数参数规范)也会失败,因为大多数装饰器都会有一个*args, **kwargs不管装饰函数的argspec .异常检查似乎也不可靠,因为myfunc.__name__对于大多数装饰器来说,无论核心功能的名称如何,它都只是"包装".

如果函数可能有也可能没有装饰器,有没有什么好的解决方案?

Win*_*ert 7

你可以做:

    try:
        myfunc()
    except IndexError:
        trace = sys.exc_info()[2]
        if trace.tb_next.tb_next is None:
            pass
        else:
            raise
Run Code Online (Sandbox Code Playgroud)

虽然它有点难看,似乎违反了封装.

在风格上,想要抓住过多的论点似乎很奇怪.我怀疑对你正在做的事情进行更普遍的反思可能会解决问题.但没有更多细节,我无法确定.

编辑

可能的方法:检查您调用的函数是否具有参数*args,**kwargs.如果是,则假设它是一个装饰器并调整上面的代码以检查异常是否是另一个层.如果不是,请按上述方法检查.

不过,我认为你需要重新考虑你的解决方案.


Dav*_*ave 2

不幸的是,事实并非如此。最好的办法是内省返回的错误对象,看看是否提到了 myfunc 和参数数量。

所以你会做类似的事情:

except TypeError, err:
    if err.has_some_property or 'myfunc' in str(err):
        fixit()
    raise
Run Code Online (Sandbox Code Playgroud)