在哪里可以找到Python内置程序引发的异常?

在哪里可以找到Python内置程序引发的异常?,python,exception,exception-handling,Python,Exception,Exception Handling,我正在编写一个装饰程序来验证一些函数。我尝试尽可能多地使用内置程序来完成繁重的工作,但我一直无法选择在使用它们时应该捕获哪些异常 例如: def Validated(fun): def ValidatedFun(*args, **kwargs): try: _ = dict(kwargs.get('untrusted_data', ())) except ? as e: raise BetterError('

我正在编写一个装饰程序来验证一些函数。我尝试尽可能多地使用内置程序来完成繁重的工作,但我一直无法选择在使用它们时应该捕获哪些异常

例如:

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
    (和其他内置)明确提出的派生异常有哪些
  • 在哪里可以找到列出它们的文档?(他们不在 )

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

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


TypeError
表示不支持传入的对象类型;文档中包含接受的类型(映射或iterable对象),其他所有内容都会引发异常。接受的类型必须符合某些期望;如果不满足这些条件,将引发
ValueError
(类型正确,但值错误)。

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

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

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

您可以简单地尝试可能引发的异常,这就是为什么它们通常没有被记录的原因。对于文档中描述的行为,请尝试打破期望。@MartijnPieters我希望有可靠的文档。例外情况是
TypeError
ValueError
;第一次是根据文档传递无效类型,第二次是类型正确,但未达到预期。虽然我相信你是对的,但我仍然想知道将来在哪里可以可靠地找到这些信息。呃,我们不要忘记最常见的dict例外情况:
KeyError
,查找中不存在的密钥时引发dict@SamHartman创建字典时不会引发
keyrerror
,就像OP的code
dict(不受信任的数据)
@BrianRodriguez:您可以在异常文档中找到它;它并不是针对每个可调用的函数都有文档记录,因为这将是对相同信息的大量冗余重复。我应该提到:这是针对一个为我的函数添加此类验证的装饰程序,所以它实际上正是这样做的。此外,我并没有隐藏错误,而是将其附加到新错误的消息中。@Brian Rodriguez我读到这个问题是问dict类(而不仅仅是它的构造函数)引发了哪些错误。也就是说,从
dict()
产生的对象中可以得到哪些错误。我同意这个问题是不明确的。class Untrusted(object):def _uiter _;(self):raise arriryexception(“任何事情都可能发生”)Untrusted_data=Untrusted()dict(Untrusted_data)显然,注释不支持代码格式。不管怎样,dict怎么知道它的参数会导致迭代器方法过载的自定义异常是什么呢?@harfel我想知道dict会显式引发什么,我不在乎数据本身是否会引发任意异常。我已经更新了我的帖子来反映这一点。那么你可能得去看源代码了。至少我不会知道另一种方法。结果表明,构造函数显式地引发了TypeError(如果对象实现了迭代器协议但无法转换为序列)和ValueError(对于dict([None,1,“a”,False])…)