在 Python 中,所有异常都必须是派生自 BaseException. 在带有提及特定类try的子句的语句except 中,该子句还处理从该类派生的任何异常类(但不处理派生异常类)。通过子类化不相关的两个异常类永远不会等价,即使它们具有相同的名称。

下面列出的内置异常可以由解释器或内置函数生成。除非另有说明,否则它们都有一个“关联值”,指示错误的详细原因。这可能是一个字符串或几项信息的元组(例如,错误代码和解释代码的字符串)。关联的值通常作为参数传递给异常类的构造函数。

用户代码可以引发内置异常。这可用于测试异常处理程序或报告错误情况,“就像”解释器引发相同异常的情况一样;但请注意,没有什么可以阻止用户代码引发不适当的错误。

内置的异常类可以被子类化以定义新的异常;鼓励程序员从Exception 类或其子类之一而不是从BaseException. 有关定义异常的更多信息,请参阅 Python 教程中的 用户定义的异常

当引发(或重新引发)exceptor finally子句 __context__中的异常时,会自动将其设置为最后一个捕获的异常;如果未处理新异常,则最终显示的回溯将包括原始异常和最终异常。

当引发一个新异常时(而不是使用一个bareraise来重新引发当前正在处理的异常),隐式异常上下文可以通过使用fromwith 来补充一个显式原因raise

raise new_exc from original_exc

后面的表达式from必须是异常或None。它将被设置为__cause__引发的异常。设置 __cause__还隐式地将__suppress_context__ 属性设置为True,因此 using 有效地将旧异常替换为新异常以用于显示目的(例如转换为),同时在调试时保留旧异常以供自省使用。raise new_exc from NoneKeyErrorAttributeError__context__

除了异常本身的回溯之外,默认的回溯显示代码还会显示这些链接的异常。__cause__当存在时,始终显示显式链接的异常。__context__仅当__cause__ isNone__suppress_context__为 false时才会显示隐式链接异常。

在任何一种情况下,异常本身总是显示在任何链式异常之后,因此回溯的最后一行总是显示引发的最后一个异常。

基类

以下异常主要用作其他异常的基类。

exception BaseException

所有内置异常的基类。它并不意味着由用户定义的类直接继承(为此,使用Exception)。如果 str()在此类的实例上调用,则返回实例的参数表示形式,或者在没有参数时返回空字符串。

args
给异常构造函数的参数元组。一些内置异常(如OSError)需要一定数量的参数并为此元组的元素分配特殊含义,而另一些通常仅使用单个字符串调用并给出错误消息。
with_traceback(待定
此方法将tb设置为异常的新回溯并返回异常对象。它通常用在这样的异常处理代码中:
try:
    ...
except SomeException:
    tb = sys.exc_info()[2]
    raise OtherException(...).with_traceback(tb)
exception Exception
所有内置的,非系统退出的异常都派生自此类。所有用户定义的异常也应该从该类派生。
exception ArithmeticError
对于那些内置异常的基类时引发的各种算术错误:OverflowErrorZeroDivisionErrorFloatingPointError
exception BufferError
无法执行与缓冲区相关的操作时引发。
exception LookupError
当映射或序列上使用的键或索引无效时引发的异常的基类:IndexErrorKeyError。这可以直接提出codecs.lookup()

具体异常

以下例外是通常引发的例外情况。

exception AssertionError

assert声明失败时引发。

exception AttributeError
当属性引用(请参阅属性引用)或赋值失败时引发。(当一个对象完全不支持属性引用或属性赋值时TypeError)。
exception EOFError
input()函数在没有读取任何数据的情况下达到文件结束条件(EOF)时引发。(注意:io.IOBase.read()和的 io.IOBase.readline()方法在击中EOF时返回一个空字符串。)
exception FloatingPointError
目前尚未使用。
exception GeneratorExit
发电机协程关闭时抬起 ; 看到generator.close()coroutine.close()。它直接继承BaseException而不是Exception因为它在技术上不是错误。
exception ImportError
import语句试图加载模块时遇到麻烦。当“from list”中 有一个无法找到的名称时也会引发。from ... import

namepath属性可以只使用关键字参数的构造函数中设置。设置时,它们分别代表尝试导入的模块的名称以及触发异常的任何文件的路径。

版本3.3中已更改:添加了namepath属性。

exception ModuleNotFoundError
无法定位模块时ImportError引发的子类import。当它被None 发现时它也会被提升sys.modules

版本3.6中的新功能。

exception IndexError
当序列下标超出范围时引发。(切片索引被静默截断以落在允许的范围内;如果索引不是整数,TypeError则会被提升。)
exception KeyError
在现有密钥集中找不到映射(字典)密钥时引发。
exception KeyboardInterrupt
当用户按下中断键(正常Control-C或 Delete)时触发。在执行期间,定期检查中断。异常继承,BaseException以免被捕获的代码意外捕获Exception,从而阻止解释器退出。
exception MemoryError
当操作耗尽内存时引发但情况仍可能被挽救(通过删除一些对象)。关联值是一个字符串,表示内存中耗尽了哪种(内部)操作。请注意,由于底层的内存管理架构(C的malloc()功能),解释器可能无法始终从这种情况中完全恢复; 然而,它会引发异常,以便可以打印堆栈回溯,以防出现失控程序。
exception NameError
未找到本地或全局名称时引发。这仅适用于不合格的名称。关联的值是包含无法找到的名称的错误消息。
exception NotImplementedError
此异常源自RuntimeError。在用户定义的基类中,抽象方法在需要派生类重写方法时,或者在开发类以指示仍需要添加实际实现时,应引发此异常。

注意

它不应该用于表示根本不支持运算符或方法 – 在这种情况下,要么保留运算符/方法未定义,要么保留子类,将其设置为None

注意

NotImplementedError并且NotImplemented不可互换,即使它们具有相似的名称和目的。有关NotImplemented何时使用它的详细信息,请参阅 。

exception OSError([arg])
exception OSError(errnostrerror[filename[winerror[filename2]]])

当系统函数返回与系统相关的错误时会引发此异常,包括I / O失败,例如“找不到文件”或“磁盘已满”(不是非法参数类型或其他偶然错误)。

构造函数的第二种形式设置相应的属性,如下所述。None如果未指定,则属性默认为。为了向后兼容,如果传递了三个参数,则该args属性仅包含前两个构造函数参数的2元组。

构造函数实际上经常返回一个子类OSError,如下面的OS例外中所述。特定子类取决于最终errno值。此行为仅在OSError直接构造或通过别名构建时发生,并且在子类化时不会继承。

errno
C变量的数字错误代码errno
winerror
在Windows下,这将为您提供本机Windows错误代码。errno然后,该属性是POSIX术语中的本机错误代码的近似转换。

在Windows下,如果winerror构造函数参数是整数,errno则根据Windows错误代码确定该属性,并忽略errno参数。在其他平台上,将 忽略winerror参数,并且该winerror属性不存在。

strerror
操作系统提供的相应错误消息。它由perror()POSIX FormatMessage() 下的C函数和Windows 下的格式化。
filename
filename2
对于涉及文件系统路径(例如open()或 os.unlink())的异常,filename是传递给函数的文件名。对于涉及两个文件系统路径(例如 os.rename()filename2的函数,对应于传递给函数的第二个文件名。

改变在3.3版:EnvironmentErrorIOErrorWindowsError, socket.errorselect.error和 mmap.error已合并到OSError,并构造可能会返回一个子类。

版本3.4中已更改:filename属性现在是传递给函数的原始文件名,而不是编码到文件系统编码或从文件系统编码解码的名称。此外,还添加了filename2构造函数参数和属性。

exception OverflowError
当算术运算的结果太大而无法表示时引发。对于整数而言,这种情况不会发生(宁可提高而 MemoryError不是放弃)。但是,由于历史原因,有时会在超出所需范围的整数时引发OverflowError。由于C中缺少浮点异常处理的标准化,因此不检查大多数浮点运算。
exception RecursionError
此异常源自RuntimeError。当解释器检测到sys.getrecursionlimit()超出最大递归深度(请参阅)时,会引发此问题 。

版本3.5中的新功能:之前,平原RuntimeError被提出。

exception ReferenceError
weakref.proxy()函数创建的弱引用代理用于在垃圾回收后访问引用对象的属性时,会引发此异常 。有关弱引用的更多信息,请参阅该weakref模块。
exception RuntimeError
在检测到不属于任何其他类别的错误时触发。关联值是一个字符串,表示出现了什么问题。
exception StopIteration
由内置函数next()迭代器的 __next__()方法引发,表明迭代器不再生成其他项。

异常对象有一个属性value,在构造异常时作为参数给出,默认为None

生成器协程函数返回时,将StopIteration引发一个新实例,并且该函数返回的值将用作value异常构造函数的 参数。

如果生成器代码直接或间接引发StopIteration,则将其转换为RuntimeError(保留 StopIteration作为新异常的原因)。

在版本3.3中更改:添加了value属性以及生成器函数使用它返回值的能力。

在3.5版中更改:通过引入RuntimeError转换 ,请参阅from __future__ import generator_stop

在 3.7 版更改:默认为所有代码启用 :生成器中引发的 StopIteration 错误被转换为 RuntimeError。

exception StopAsyncIteration
必须通过异步迭代器对象的__anext__()方法 引发以停止迭代。

版本3.5中的新功能。

exception StopAsyncIteration
解析器遇到语法错误时引发。这可能发生在一个 import声明,调用内置的功能exec() 或eval()阅读初始脚本或标准输入(也交互)时,或。

这个类的实例有属性filenamelineno, offset并且text为的细节更容易获得。 str() 异常实例仅返回消息。

exception SyntaxError
与不正确的缩进相关的语法错误的基类。这是一个子类SyntaxError
exception IndentationError
当缩进包含不一致的制表符和空格使用时引发。这是一个子类IndentationError
exception TabError
当缩进包含制表符和空格的不一致使用时引发。 这是 IndentationError 的子类。
exception SystemError
sys.exit()函数引发此异常。它继承 BaseException而不是Exception因为它不会被捕获的代码意外捕获Exception。这允许异常正确传播并导致解释器退出。当它没有被处理时,Python解释器退出; 没有打印堆栈回溯。构造函数接受传递给的相同可选参数sys.exit()。如果该值是整数,则指定系统退出状态(传递给C的exit()函数); 如果是None,则退出状态为零; 如果它有另一种类型(如字符串),则打印对象的值,退出状态为1。

将调用sys.exit()转换为异常,以便可以执行清理处理程序(finally语句的子句try),以便调试器可以执行脚本而不会冒失去控制的风险。os._exit()如果绝对必须立即退出(例如,在调用之后的子进程中os.fork()),则可以使用该函数。

code
传递给构造函数的退出状态或错误消息。(默认为None。)
exception SystemExit
将操作或函数应用于不适当类型的对象时引发。关联值是一个字符串,提供有关类型不匹配的详细信息。

用户代码可以引发此异常,以指示不支持对对象的尝试操作,并且不应该支持。如果一个对象旨在支持给定的操作但尚未提供实现,NotImplementedError则引发的适当例外是。

传递错误类型的参数(例如,listint预期时 传递a )应该导致a TypeError,但是传递具有错误值的参数(例如,在预期边界之外的数字)应该导致a ValueError

exception TypeError
当操作或函数应用于不适当类型的对象时引发。 关联的值是一个字符串,提供有关类型不匹配的详细信息。

用户代码可能会引发此异常,以指示不支持对对象的尝试操作,并且不支持。 如果一个对象旨在支持给定操作但尚未提供实现,则 NotImplementedError 是引发的正确异常。

传递错误类型的参数(例如,当需要一个 int 时传递一个列表)应该会导致 TypeError,但是传递具有错误值的参数(例如,超出预期边界的数字)应该会导致 ValueError。

exception UnboundLocalError
引用函数或方法中的局部变量时引发,但没有值绑定到该变量。这是一个子类 NameError

exception UnicodeError

发生与Unicode相关的编码或解码错误时引发。它是的子类ValueError

UnicodeError具有描述编码或解码错误的属性。例如,err.object[err.start:err.end]给出编解码器失败的特定无效输入。

encoding
引发错误的编码的名称。
reason
描述特定编解码器错误的字符串。
object
编解码器试图编码或解码的对象。
start
无效数据的第一个索引object
end
最后一个无效数据后的索引object
exception UnicodeEncodeError
在编码期间发生与Unicode相关的错误时引发。它是的子类 UnicodeError
exception UnicodeDecodeError
在解码期间发生与Unicode相关的错误时引发。它是的子类 UnicodeError
exception UnicodeTranslateError
在翻译期间发生与Unicode相关的错误时引发。它是的子类UnicodeError
exception ValueError
当一个操作或函数接收到一个具有正确类型但值不合适的参数时引发,并且该情况不会被更精确的异常描述,例如IndexError
exception ZeroDivisionError
当除法或模运算的第二个参数为零时引发。关联值是一个字符串,表示操作数的类型和操作。

保留以下例外以与先前版本兼容; 从Python 3.3开始,它们是别名OSError

exception EnvironmentError
exception IOError
exception WindowsError
仅适用于Windows。

操作系统异常

以下异常是子类OSError,它们会根据系统错误代码而引发。

exception BlockingIOError
当操作阻塞设置为非阻塞操作的对象(例如套接字)时引发。对应于errno EAGAINEALREADY, EWOULDBLOCKEINPROGRESS

除了那些OSErrorBlockingIOError还可以有一个属性:

characters_written
一个整数,包含在阻塞之前写入流的字符数。使用io模块中的缓冲I / O类时,此属性可用。
exception ChildProcessError
在子进程上的操作失败时引发。对应于errno ECHILD
exception ConnectionError
与连接相关的问题的基类。

子类是BrokenPipeErrorConnectionAbortedError, ConnectionRefusedErrorConnectionResetError

exception BrokenPipeError
ConnectionError尝试在管道上写入而另一端已关闭时尝试写入的子类,或尝试在已关闭以进行写入的套接字上写入的子类。对应于errno EPIPEESHUTDOWN
exception ConnectionAbortedError
ConnectionError连接尝试被对等方中止时引发的子类。对应于errno ECONNABORTED
exception ConnectionRefusedError
ConnectionError当对等方拒绝连接尝试时引发的子类。对应于errno ECONNREFUSED
exception ConnectionResetError
ConnectionError对等体重置连接时引发的子类。对应于errno ECONNRESET
exception FileExistsError
尝试创建已存在的文件或目录时引发。对应于errno EEXIST
exception FileNotFoundError
在请求文件或目录但不存在时引发。对应于errno ENOENT
exception InterruptedError
系统调用被输入信号中断时触发。对应于errno EINTR

在版本3.5中更改: Python现在在系统调用被信号中断时重试系统调用,除非信号处理程序引发异常,而不是提高InterruptedError

exception IsADirectoryError
os.remove()在目录上请求文件操作(例如)时引发。对应于errno EISDIR
exception NotADirectoryError
在对非目录的os.listdir()事物请求目录操作(例如)时引发。对应于errno ENOTDIR
exception PermissionError
尝试在没有足够访问权限的情况下运行操作时引发 – 例如文件系统权限。对应于errno EACCESEPERM
exception ProcessLookupError
当给定进程不存在时引发。对应于errno ESRCH
exception TimeoutError
系统功能在系统级别超时时触发。对应于errno ETIMEDOUT

版本3.3中的新功能:OSError添加了上述所有子类。

警告

以下例外用作警告类别; 有关详细信息,请参阅 警告类别文档。

exception Warning
警告类别的基类。
exception UserWarning
用户代码生成警告的基类。
exception DeprecationWarning
当这些警告针对其他Python开发人员时,有关已弃用功能的警告的基类。
exception PendingDeprecationWarning
有关将来不推荐使用的功能的警告的基类。
exception SyntaxWarning
关于可疑语法警告的基类。
exception RuntimeWarning
有关可疑运行时行为的警告的基类。
exception FutureWarning
当这些警告针对用Python编写的应用程序的最终用户时,有关已弃用功能的警告的基类。
exception ImportWarning
关于模块导入中可能出错的警告的基类。
exception UnicodeWarning
与Unicode相关的警告的基类。
exception BytesWarning
bytes和相关的警告的基类bytearray
exception ResourceWarning
与资源使用相关的警告的基类。被默认警告过滤器忽略。

版本3.2中的新功能。

异常类层次结构

内置异常的类层次结构是:

BaseException
 +-- SystemExit
 +-- KeyboardInterrupt
 +-- GeneratorExit
 +-- Exception
      +-- StopIteration
      +-- StopAsyncIteration
      +-- ArithmeticError
      |    +-- FloatingPointError
      |    +-- OverflowError
      |    +-- ZeroDivisionError
      +-- AssertionError
      +-- AttributeError
      +-- BufferError
      +-- EOFError
      +-- ImportError
      |    +-- ModuleNotFoundError
      +-- LookupError
      |    +-- IndexError
      |    +-- KeyError
      +-- MemoryError
      +-- NameError
      |    +-- UnboundLocalError
      +-- OSError
      |    +-- BlockingIOError
      |    +-- ChildProcessError
      |    +-- ConnectionError
      |    |    +-- BrokenPipeError
      |    |    +-- ConnectionAbortedError
      |    |    +-- ConnectionRefusedError
      |    |    +-- ConnectionResetError
      |    +-- FileExistsError
      |    +-- FileNotFoundError
      |    +-- InterruptedError
      |    +-- IsADirectoryError
      |    +-- NotADirectoryError
      |    +-- PermissionError
      |    +-- ProcessLookupError
      |    +-- TimeoutError
      +-- ReferenceError
      +-- RuntimeError
      |    +-- NotImplementedError
      |    +-- RecursionError
      +-- SyntaxError
      |    +-- IndentationError
      |         +-- TabError
      +-- SystemError
      +-- TypeError
      +-- ValueError
      |    +-- UnicodeError
      |         +-- UnicodeDecodeError
      |         +-- UnicodeEncodeError
      |         +-- UnicodeTranslateError
      +-- Warning
           +-- DeprecationWarning
           +-- PendingDeprecationWarning
           +-- RuntimeWarning
           +-- SyntaxWarning
           +-- UserWarning
           +-- FutureWarning
           +-- ImportWarning
           +-- UnicodeWarning
           +-- BytesWarning
           +-- ResourceWarning