区分由错误的函数参数触发并由函数体触发的TypeError

时间:2012-10-12 20:41:35

标签: python exception-handling typeerror

考虑

try:
    f(*args, **kwargs)
except TypeError:
    print "doh!"

在这种情况下TypeError的原因可能是函数参数中的问题,例如f() got an unexpected keyword argument 'b'。但是,由于功能体本身存在问题,也可能引发TypeError,例如list indices must be integers, not str

我想知道在Python 2中是否有一个可靠的方法来区分这两种情况(参数问题,正文中的问题)。也许是一些基于装饰的方法?

推理:我正在实施另一种工作制度。工作基本上是一种功能。此函数的参数可以从用户输入派生,并通过JSON序列化/反序列化过程。我希望系统尽可能向系统用户提供错误消息。因此,我希望控制作业执行的实体能够区分TypeError的两个来源。此外,我认为这本身就是一个非常有趣的问题。

我意识到https://stackoverflow.com/questions/12712475/how-to-check-if-a-typeerror-raised-from-mismatched-function-arguments基本上是这个问题的副本。然而,那里的评论讨论刚刚停止,没有任何答案。我希望在这种情况下可以打开我自己的问题并重新制定问题。

2 个答案:

答案 0 :(得分:1)

所以我不会这样做,因为你想要传播的内部错误是编码错误,而不是需要捕获的实际异常。

话虽如此。我会反省被抛出的错误,并沉默一个并传播另一个。

答案 1 :(得分:0)

我很确定你可以通过以下方式解决这个问题:

第1步。通过继承AwfulTypeError体内TypeError 创建自定义例外(例如Exception):

class AwfulTypeError(Exception):
    pass  # Or do something if necessary

第2步。整个功能正文包裹在try块中,except TypeError包含该块:

def my_function(a, b, c):
    try:
        # Some operations you need to do
        return (a + b) * c
    except TypeError as e:
        # We're doing stuff here in the next step

第3步。在捕获原始TypeError异常时,请将其重新提升为您之前指定的AwfulTypeError异常:

    except TypeError as e:
        raise AwfulTypeError(e)

现在,您可以从体内TypeError 中区分参数TypeError ,它仍然是TypeError,现在类型为{{ 1}}。

PS 我更习惯 Python 3 ,所以如果我用 Python 2 语法弄乱了一些东西,请随意通知我。