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

Python 捕获特定函数调用的错误签名错误,python,error-handling,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 param

我可以有这样的代码:

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")
模块的用户将选择一个函数和一个参数字典。函数运行时,用户会被告知sum的参数是否错误(因为使用不正确的参数调用函数会引发
TypeError
)。如果函数出现错误并引发其他类型的异常,将显示“内部错误”

很好,差不多。由于函数内部的错误调用,
sum
函数可能被窃听并引发
TypeError
。这应作为内部错误报告


当函数中出现
TypeError
时,如何捕捉使用错误参数调用
sum
函数并避免误报的情况?

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

  • 手动定制所有功能

  • 使用函数内省检查参数是否对函数有效。这可能会遗漏边缘情况,比如带有泛型修饰符的包装函数。有关如何检查这一点,请参见NTRGC的答案

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

  • 没有生活

定义了一个有帮助的签名对象。默认情况下,Python 3.3+中包含了它,但对于早期版本则是如此

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

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")

你想要这个干什么?不幸的是,我认为这在一般情况下是不可能的。考虑某人使用“代码>函数工具。部分< /代码>或一个装饰器。例如,我一直认为Python应该在错误的签名或错误签名的情况下提出比TypeError更具描述性的东西。但不幸的是,区分此类型错误和其他类型错误的唯一方法是实际查看消息。您可以在内部函数中捕获
TypeError
s,确保“误报”被省略。@Veedrac类似RPC的服务
except
Exception
更好,除非您也想捕获
键盘中断
,顺便说一句。