内置异常类及异常处理except与Exception(9) – Python语言(必读进阶学习教程)(参考资料)
在 Python 中,所有异常都必须是派生自 BaseException
. 在带有提及特定类try
的子句的语句except
中,该子句还处理从该类派生的任何异常类(但不处理派生它的异常类)。通过子类化不相关的两个异常类永远不会等价,即使它们具有相同的名称。
下面列出的内置异常可以由解释器或内置函数生成。除非另有说明,否则它们都有一个“关联值”,指示错误的详细原因。这可能是一个字符串或几项信息的元组(例如,错误代码和解释代码的字符串)。关联的值通常作为参数传递给异常类的构造函数。
用户代码可以引发内置异常。这可用于测试异常处理程序或报告错误情况,“就像”解释器引发相同异常的情况一样;但请注意,没有什么可以阻止用户代码引发不适当的错误。
内置的异常类可以被子类化以定义新的异常;鼓励程序员从Exception
类或其子类之一而不是从BaseException
. 有关定义异常的更多信息,请参阅 Python 教程中的 用户定义的异常。
当引发(或重新引发)except
or finally
子句 __context__
中的异常时,会自动将其设置为最后一个捕获的异常;如果未处理新异常,则最终显示的回溯将包括原始异常和最终异常。
当引发一个新异常时(而不是使用一个bareraise
来重新引发当前正在处理的异常),隐式异常上下文可以通过使用from
with 来补充一个显式原因raise
:
raise new_exc from original_exc
后面的表达式from
必须是异常或None
。它将被设置为__cause__
引发的异常。设置 __cause__
还隐式地将__suppress_context__
属性设置为True
,因此 using 有效地将旧异常替换为新异常以用于显示目的(例如转换为),同时在调试时保留旧异常以供自省使用。raise new_exc from None
KeyError
AttributeError
__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
- 对于那些内置异常的基类时引发的各种算术错误:
OverflowError
,ZeroDivisionError
,FloatingPointError
。
- exception
BufferError
- 无法执行与缓冲区相关的操作时引发。
- exception
LookupError
- 当映射或序列上使用的键或索引无效时引发的异常的基类:
IndexError
,KeyError
。这可以直接提出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
该
name
和path
属性可以只使用关键字参数的构造函数中设置。设置时,它们分别代表尝试导入的模块的名称以及触发异常的任何文件的路径。版本3.3中已更改:添加了
name
和path
属性。
- 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
(errno, strerror[, 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()
POSIXFormatMessage()
下的C函数和Windows 下的格式化。
filename
filename2
- 对于涉及文件系统路径(例如
open()
或os.unlink()
)的异常,filename
是传递给函数的文件名。对于涉及两个文件系统路径(例如os.rename()
)filename2
的函数,对应于传递给函数的第二个文件名。
改变在3.3版:
EnvironmentError
,IOError
,WindowsError
,socket.error
,select.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()
阅读初始脚本或标准输入(也交互)时,或。这个类的实例有属性
filename
,lineno
,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
则引发的适当例外是。传递错误类型的参数(例如,
list
在int
预期时 传递a )应该导致aTypeError
,但是传递具有错误值的参数(例如,在预期边界之外的数字)应该导致aValueError
。
- 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
EAGAIN
,EALREADY
,EWOULDBLOCK
和EINPROGRESS
。除了那些
OSError
,BlockingIOError
还可以有一个属性:characters_written
- 一个整数,包含在阻塞之前写入流的字符数。使用
io
模块中的缓冲I / O类时,此属性可用。
- exception
ChildProcessError
- 在子进程上的操作失败时引发。对应于
errno
ECHILD
。
- exception
ConnectionError
- 与连接相关的问题的基类。
子类是
BrokenPipeError
,ConnectionAbortedError
,ConnectionRefusedError
和ConnectionResetError
。
- exception
BrokenPipeError
ConnectionError
尝试在管道上写入而另一端已关闭时尝试写入的子类,或尝试在已关闭以进行写入的套接字上写入的子类。对应于errno
EPIPE
和ESHUTDOWN
。
- 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
EACCES
和EPERM
。
- 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