1

考虑

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基本上是这个问题的副本。然而,那里的评论讨论只是没有任何答案就停止了。我希望在这种情况下,可以打开我自己的问题并重新表述问题。

4

2 回答 2

1

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

话虽如此。我会反省抛出的错误,然后让一个错误并传播另一个。

于 2012-10-12T21:09:12.473 回答
0

我很确定您可以通过以下方式解决此问题:

步骤 1.通过子类化为体内 TypeError创建一个自定义异常(例如AwfulTypeError):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)

现在您可以将仍然是 a的参数 TypeErrorTypeError与现在是 type的体内 TypeErrorAwfulTypeError区分开来。

PS我更习惯Python 3,所以如果我弄乱了Python 2的语法,请随时通知我。

于 2017-08-09T11:00:44.817 回答