考虑
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基本上是这个问题的副本。然而,那里的评论讨论刚刚停止,没有任何答案。我希望在这种情况下可以打开我自己的问题并重新制定问题。
答案 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 语法弄乱了一些东西,请随意通知我。