You are here:  Home » Python » 内置异常except与Exception(9)Python语言(必读进阶学习教程)(参考资料)

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

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

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

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

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

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

raise new_exc from original_exc

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

除了异常本身的回溯之外,默认回溯显示代码还显示这些链接的异常。__cause__当存在时,始终显示明确链接的异常。隐式异常链中__context__只显示了如果__cause__ 是None__suppress_context__是假的。

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

基类

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

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

args
赋予异常构造函数的参数元组。一些内置异常(例如OSError)期望一定数量的参数并为该元组的元素赋予特殊含义,而其他异常通常仅使用单个字符串来调用,从而产生错误消息。
with_tracebacktb 
此方法将tb设置为异常的新回溯并返回异常对象。它通常用于异常处理代码,如下所示:

try:
    ...
except SomeException:
    tb = sys.exc_info()[2]
    raise OtherException(...).with_traceback(tb)
异常Exception
所有内置的,非系统退出的异常都派生自此类。所有用户定义的异常也应该从该类派生。
异常ArithmeticError
对于那些内置异常的基类时引发的各种算术错误:OverflowErrorZeroDivisionErrorFloatingPointError
异常BufferError
无法执行与缓冲区相关的操作时引发。
异常LookupError
当映射或序列上使用的键或索引无效时引发的异常的基类:IndexErrorKeyError。这可以直接提出codecs.lookup()

具体异常

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

异常AssertionError

assert声明失败时引发。

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

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

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

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

版本3.6中的新功能。

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

注意

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

注意

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

异常OSErrorarg 
异常OSErrorerrnostrerror [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构造函数参数和属性。

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

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

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

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

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

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

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

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

版本3.7中已更改:启用默认情况下,所有代码的 PEP 479StopIteration 生成器中引发的错误转换为aRuntimeError

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

版本3.5中的新功能。

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

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

异常IndentationError
与不正确的缩进相关的语法错误的基类。这是一个子类SyntaxError
异常TabError
当缩进包含不一致的制表符和空格使用时引发。这是一个子类IndentationError
异常SystemError
当解释器发现内部错误时引发,但情况看起来并不那么严重,导致它放弃所有希望。关联值是一个表示出错的字符串(以低级别表示)。

您应该将此报告给Python解释器的作者或维护者。确保报告Python解释器的版本(sys.version;它也在交互式Python会话的开头打印),确切的错误消息(异常的相关值)以及可能的触发错误的程序源。

异常SystemExit
sys.exit()函数引发此异常。它继承 BaseException而不是Exception因为它不会被捕获的代码意外捕获Exception。这允许异常正确传播并导致解释器退出。当它没有被处理时,Python解释器退出; 没有打印堆栈回溯。构造函数接受传递给的相同可选参数sys.exit()。如果该值是整数,则指定系统退出状态(传递给C的exit()函数); 如果是None,则退出状态为零; 如果它有另一种类型(如字符串),则打印对象的值,退出状态为1。

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

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

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

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

异常UnboundLocalError
引用函数或方法中的局部变量时引发,但没有值绑定到该变量。这是一个子类 NameError
异常UnicodeError
发生与Unicode相关的编码或解码错误时引发。它是的子类ValueError

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

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

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

异常EnvironmentError
异常IOError
异常WindowsError
仅适用于Windows。

操作系统异常

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

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

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

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

子类是BrokenPipeErrorConnectionAbortedError, ConnectionRefusedErrorConnectionResetError

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

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

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

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

也可以看看

PEP 3151 – 重新处理OS和IO异常层次结构

警告

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

异常Warning
警告类别的基类。
异常UserWarning
用户代码生成警告的基类。
异常DeprecationWarning
当这些警告针对其他Python开发人员时,有关已弃用功能的警告的基类。
异常PendingDeprecationWarning
有关将来不推荐使用的功能的警告的基类。
异常SyntaxWarning
关于可疑语法警告的基类。
异常RuntimeWarning
有关可疑运行时行为的警告的基类。
异常FutureWarning
当这些警告针对用Python编写的应用程序的最终用户时,有关已弃用功能的警告的基类。
异常ImportWarning
关于模块导入中可能出错的警告的基类。
异常UnicodeWarning
与Unicode相关的警告的基类。
异常BytesWarning
bytes和相关的警告的基类bytearray
异常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