内置异常

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

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

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

可以对内置异常类进行子类化以定义新的异常;鼓励程序员从 Exception 类或其子类之一,而不是来自 BaseException .有关定义异常的详细信息,请参见下面的python教程 用户定义异常 .

在引发(或重新引发)异常时 exceptfinally 条款 __context__ 自动设置为捕获的最后一个异常;如果未处理新异常,则最终显示的跟踪将包括原始异常和最终异常。

引发新的异常时(而不是使用 raise 要重新引发当前正在处理的异常,可以使用 from 具有 raise ::

raise new_exc from original_exc

下面的表达式 from 必须是例外或 None . 它将被设置为 __cause__ 在引发的异常上。设置 __cause__ 还隐式设置 __suppress_context__ 属性到 True ,以便使用 raise new_exc from None 有效地将旧的异常替换为新的异常以用于显示目的(例如转换 KeyErrorAttributeError ,同时将旧的异常保留在 __context__ 用于调试时的自省。

除了异常本身的跟踪之外,默认的跟踪显示代码还显示这些链接的异常。中显式链接的异常 __cause__ 出现时始终显示。中隐式链接的异常 __context__ 仅当 __cause__None__suppress_context__ 是假的。

在这两种情况下,异常本身总是显示在任何链接的异常之后,以便跟踪的最后一行总是显示最后一个引发的异常。

基类

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

exception BaseException

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

args

为异常构造函数提供的参数的元组。一些内置异常(如 OSError )期望一定数量的参数,并为这个元组的元素指定一个特殊的含义,而其他的通常只使用一个给出错误消息的字符串来调用。

with_traceback(tb)

此方法设置 tb 作为异常的新回溯,并返回异常对象。在使用异常链接功能之前,它更常用 PEP 3134 变得有空了。下面的示例显示如何将 SomeException 转换为 OtherException 同时保留可追溯性。一旦引发,当前帧将被推送到 OtherException ,就像回溯原件一样 SomeException 如果我们允许它传播给呼叫者。

尝试:

..。

除SomeException外:

tb=sys.exc_info() [2] 引发OtherException(.).with_traceback(TB)

exception Exception

所有内置的、非系统退出的异常都是从此类派生的。所有用户定义的异常也应从此类派生。

exception ArithmeticError

针对各种算术错误引发的内置异常的基类: OverflowErrorZeroDivisionErrorFloatingPointError .

exception BufferError

升高时 buffer 无法执行相关操作。

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

升高时 generatorcoroutine 关闭;见 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-CDelete )在执行期间,定期检查中断。异常继承自 BaseException 以免被捕获的代码意外捕获 Exception 从而防止译员退出。

exception MemoryError

当一个操作耗尽内存,但仍有可能挽救(通过删除一些对象)时引发。关联值是一个字符串,指示哪种(内部)操作耗尽了内存。注意,由于底层内存管理体系结构(C malloc() 函数),解释器可能并不总是能够完全从这种情况中恢复过来;但是它会引发一个异常,以便在导致程序失控的情况下可以打印堆栈回溯。

exception NameError

在找不到本地或全局名称时引发。这只适用于不合格的名称。关联值是一条错误消息,其中包含找不到的名称。

exception NotImplementedError

此异常源于 RuntimeError . 在用户定义的基类中,当抽象方法需要派生类来重写该方法时,或者在开发该类以指示仍然需要添加实际实现时,抽象方法应引发此异常。

注解

它不应该用于指示一个运算符或方法根本不受支持——在这种情况下,要么不定义该运算符/方法,要么将其设置为 None .

注解

NotImplementedErrorNotImplemented 不可互换,即使它们有相似的名称和目的。见 NotImplemented 有关何时使用它的详细信息。

exception OSError([arg])
exception OSError(errno, strerror[, filename[, winerror[, filename2]]])

当系统函数返回与系统相关的错误(包括“找不到文件”或“磁盘已满”等I/O错误)时,会引发此异常(不适用于非法参数类型或其他附带错误)。

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

构造函数通常实际返回 OSError ,如中所述 OS exceptions 下面。特定的子类取决于 errno 价值。只有在构造 OSError 直接或通过别名,子类化时不继承。

errno

来自C变量的数字错误代码 errno .

winerror

在Windows下,这将提供本机Windows错误代码。这个 errno 然后,属性是该本机错误代码的一个近似转换,用posix术语表示。

在Windows下面,如果 Win错误 构造函数参数是一个整数, errno 属性由Windows错误代码确定,并且 埃尔诺 参数被忽略。在其他平台上, Win错误 参数被忽略,并且 winerror 属性不存在。

strerror

操作系统提供的相应错误消息。它由C函数格式化 perror() 在POSIX下,和 FormatMessage() 在Windows下。

filename
filename2

对于涉及文件系统路径的异常(例如 open()os.unlink()filename 是传递给函数的文件名。对于涉及两个文件系统路径的函数(例如 os.rename()filename2 对应于传递给函数的第二个文件名。

在 3.3 版更改: EnvironmentErrorIOErrorWindowsErrorsocket.errorselect.errormmap.error 已合并到 OSError ,构造函数可以返回子类。

在 3.4 版更改: 这个 filename 属性现在是传递给函数的原始文件名,而不是编码到 filesystem encoding and error handler 。另外, 文件名2 已添加构造函数参数和属性。

exception OverflowError

当算术运算的结果太大而无法表示时引发。这不能发生在整数上(它宁愿 MemoryError 而不是放弃。但是,由于历史原因,有时会对超出所需范围的整数引发溢出错误。由于C语言中缺乏浮点异常处理的标准化,大多数浮点操作都没有进行检查。

exception RecursionError

此异常源于 RuntimeError . 当解释器检测到最大递归深度(请参见 sys.getrecursionlimit() )超过了。

3.5 新版功能: 以前是平原 RuntimeError 提高了。

exception ReferenceError

当弱引用代理(由 weakref.proxy() 函数,用于在被垃圾收集后访问引用的属性。有关弱引用的详细信息,请参见 weakref 模块。

exception RuntimeError

在检测到不属于任何其他类别的错误时引发。关联值是一个字符串,指示发生了什么错误。

exception StopIteration

由内置函数引发 next() 和一个 iterator__next__() 方法来表示迭代器没有生成其他项。

异常对象只有一个属性 value ,在构造异常时作为参数提供,默认为 None .

当A generatorcoroutine 函数返回,新的 StopIteration 引发实例,函数返回的值用作 value 异常的构造函数的参数。

如果生成器代码直接或间接引发 StopIteration ,它被转换为 RuntimeError (保持 StopIteration 作为新例外的原因)。

在 3.3 版更改: 补充 value 属性以及生成器函数使用它返回值的能力。

在 3.5 版更改: 介绍了runtimeerror转换 from __future__ import generator_stopPEP 479 .

在 3.7 版更改: 使能 PEP 479 默认情况下,对于所有代码: StopIteration 在生成器中引发的错误被转换为 RuntimeError .

exception StopAsyncIteration

必须由提出 __anext__() AN方法 asynchronous iterator 对象以停止迭代。

3.5 新版功能.

exception SyntaxError

在分析器遇到语法错误时引发。这可能发生在 import 语句,在对内置函数的调用中 exec()eval() 或者在读取初始脚本或标准输入时(也可以交互)。

此类的实例具有属性 filenamelinenooffsettext 更方便地访问细节。 str() 只返回异常实例的消息。

exception IndentationError

与不正确的缩进相关的语法错误的基类。这是 SyntaxError .

exception TabError

当缩进包含制表符和空格的不一致使用时引发。这是 IndentationError .

exception SystemError

当解释器发现内部错误时引发,但这种情况看起来并不严重,因此它放弃了所有希望。关联值是一个字符串,指示出了什么问题(在低级术语中)。

您应该向Python解释器的作者或维护者报告这一点。一定要报告python解释器的版本 (sys.version ;它也会在交互式Python会话开始时打印)、确切的错误消息(异常的关联值)以及触发错误的程序源(如果可能)。

exception SystemExit

此异常由引发 sys.exit() 功能。它继承自 BaseException 而不是 Exception 以便它不会被捕获的代码意外捕获 Exception . 这允许异常正确地向上传播并导致解释器退出。如果不处理,则退出python解释器;不打印堆栈回溯。构造函数接受传递给的相同可选参数 sys.exit() .如果该值为整数,则指定系统退出状态(传递到C's exit() 功能);如果是 None ,退出状态为零;如果它有其他类型(如字符串),则打印对象的值,退出状态为一。

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

code

传递给构造函数的退出状态或错误消息。(默认为 None

exception TypeError

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

用户代码可能会引发此异常,以指示不支持对对象尝试的操作,并且不打算这样做。如果一个对象打算支持一个给定的操作,但还没有提供一个实现, NotImplementedError 是适当的例外。

传递错误类型的参数(例如传递 list 当一个 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

当除法或模运算的第二个参数为零时引发。关联值是指示操作数类型和操作的字符串。

为了与以前的版本兼容,保留了以下异常;从Python3.3开始,它们是的别名 OSError .

exception EnvironmentError
exception IOError
exception WindowsError

仅在Windows上可用。

操作系统异常

以下异常是 OSError ,它们将根据系统错误代码进行引发。

exception BlockingIOError

当操作将阻塞为非阻塞操作设置的对象(例如套接字)时引发。相对应 errno EAGAINEALREADYEWOULDBLOCKEINPROGRESS .

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

characters_written

一个整数,包含在流被阻止之前写入流的字符数。当使用来自 io 模块。

exception ChildProcessError

在子进程上的操作失败时引发。相对应 errno ECHILD .

exception ConnectionError

连接相关问题的基类。

子类是 BrokenPipeErrorConnectionAbortedErrorConnectionRefusedErrorConnectionResetError .

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现在重试系统调用,除非信号处理程序引发异常(请参见 PEP 475 因为理由),而不是提出 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 添加了子类。

参见

PEP 3151 -改写操作系统和IO异常层次结构

警告

以下异常用作警告类别;请参见 警告类别 有关详细信息的文档。

exception Warning

警告类别的基类。

exception UserWarning

由用户代码生成的警告的基类。

exception DeprecationWarning

用于警告已弃用的功能(当这些警告是针对其他Python开发人员时)的基类。

被默认警告过滤器忽略,除了 __main__ 模块 (PEP 565 ). 启用 Python Development Mode 显示此警告。

exception PendingDeprecationWarning

用于警告功能的基类,这些功能已过时,预计将来将被弃用,但目前不被弃用。

此类很少用于发出有关可能即将发生的弃用的警告,这是不寻常的,并且 DeprecationWarning 对于已处于活动状态的弃用,首选。

被默认警告筛选器忽略。启用 Python Development Mode 显示此警告。

exception SyntaxWarning

有关可疑语法的警告的基类。

exception RuntimeWarning

有关可疑运行时行为的警告的基类。

exception FutureWarning

当这些警告用于用Python编写的应用程序的最终用户时,用于警告已弃用的功能的基类。

exception ImportWarning

有关模块导入中可能出错的警告的基类。

被默认警告筛选器忽略。启用 Python Development Mode 显示此警告。

exception UnicodeWarning

与Unicode相关的警告的基类。

exception BytesWarning

与相关警告的基类 bytesbytearray .

exception ResourceWarning

与资源使用有关的警告的基类。

被默认警告筛选器忽略。启用 Python Development Mode 显示此警告。

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