繁体   English   中英

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

[英]Catch bad signature error for an specific function call

我可以有这样的代码:

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函数可能会被bug并引发TypeError 这应该报告为内部错误。

如何捕获使用错误参数调用sum函数并在函数内TypeError时避免误报的情况?

PEP-0362定义了一个有用的签名对象。 它默认包含在Python 3.3+中,但是早期版本有一个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")

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

  • 手动定制所有功能。

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

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

  • 没有。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM