我在哪里可以找到Python内置函数引发的异常?

时间:2017-05-30 12:32:08

标签: python exception exception-handling

我正在写一个装饰器来验证一些功能。我尽可能地使用内置插件来完成繁重的工作,但是我一直在坚持选择使用它时应该捕获的异常。

例如:

def Validated(fun):
    def ValidatedFun(*args, **kwargs):
        try:
            _ = dict(kwargs.get('untrusted_data', ()))
        except ? as e:
            raise BetterError('Additional relevant info') from e
        return fun(*args, **kwargs)
    return ValidatedFun

我想知道:

  • dict(以及其他内置插件)明确引发的最常见的例外情况是什么?
  • 我在哪里可以找到列出它们的文档? (他们不是 https://docs.python.org/

2 个答案:

答案 0 :(得分:6)

所有Python标准类型都遵循一些默认异常的约定。行为记录为for the exceptions,而不是类型。

对于dict,例外情况为TypeErrorValueError。此时可以引发其他异常,但这些异常不依赖于输入(MemoryErrorKeyboardInterrupt)。

TypeError表示不支持传入的对象类型; dict documentation文档接受哪些类型被接受(映射或可迭代对象),其他一切都是引发异常的原因。接受的类型必须符合某些期望;如果不满足,则引发ValueError(正确的类型,但值是错误的)。

答案 1 :(得分:1)

没有特定python函数可以抛出的异常列表。这是由于python的鸭子打字。由于您可以提供任何类型的对象作为函数参数,并且由于这些函数可以在其实现中执行任何他们想要的操作,因此原则上可以引发任何异常。通常,文档清楚它们在特定条件下会出现什么异常(例如,当找不到文件时出现IOError),但这与“函数可以抛出的所有异常的列表”不同。

我还建议您不要在计划时将异常重定向到“BetterError”,因为这会隐藏错误最初发生的原始原因和位置。如果您真的想提供更好的错误消息,请在函数开头进行参数验证,并针对无法排除但会引发任何异常的情况引发ValueErrors:

if not is_valid_data(untrusted_data) :
    raise ValueError("invalid input")
unused_dict = dict(untrusted_data)