捕获特定函数调用的错误签名错误

时间:2014-06-10 13:30:49

标签: python error-handling

我可以有这样的代码:

def sum(a, b):
    return a + b

# User chooses function and parameters
function = sum
params = {"a": 5, "b": 3}

try:
    ret = sum(**params)
    print(ret)
except TypeError:
    # Function called with bad signature
    print("Wrong parameters for the chosen function!")
except:
    print("Internal error")

模块的用户将选择函数和params字典。该函数运行并且用户被告知sum的参数是否错误(因为调用具有不正确参数的函数会引发TypeError)。如果该功能被窃听并引发其他类型的异常,则内部错误'显示。

嗯,差不多。由于在函数内部进行了错误的调用,sum函数可能会出错并引发TypeError。这应该被报告为内部错误。

如何在错误参数下调用sum函数并在函数内引发TypeError时避免误报?

2 个答案:

答案 0 :(得分:2)

PEP-0362定义了一个有用的签名对象。它默认包含在Python 3.3+中,但there is a backport包含在早期版本中。

这是使用签名对象检查正确参数的代码:

import sys
try:
    from inspect import signature
except ImportError:
    from funcsigs import signature

def sum(a, b):
    return a + b

# User chooses function and parameters
function = sum
params = {"a": 5, "b": 3}

try:
    # Check signature
    signature(function).bind(**params)
except TypeError:
    # Function called with bad signature
    print("Wrong parameters for function!")
    sys.exit(1)

# Signature is fine, continue...
try:
    ret = sum(**params)
    print(ret)
except:
    # Exception in function
    print("Internal error")

答案 1 :(得分:1)

您有四个选项,其中没有一个是理想选择

  • 手动定制所有功能。

  • 使用函数内省检查参数是否对函数有效。这可能会遗漏边缘情况,例如带有通用装饰器的包装函数。请参阅ntrrgc的答案,了解如何检查此内容。

  • 检查错误消息。但是,如果函数错误地调用另一个函数,则可以捕获内部错误。

  • 没有生活。