在Python中,所有异常都必须是派生类的实例 BaseException
。在try
同一个声明中except
说提到一类特殊条款,该条款还处理来自类(从中但也不例外类派生的任何异常类它派生)。通过子类化不相关的两个异常类永远不是等效的,即使它们具有相同的名称。
下面列出的内置异常可以由解释器或内置函数生成。除非提及,否则它们具有指示错误的详细原因的“关联值”。这可以是几个信息项的字符串或元组(例如,错误代码和解释代码的字符串)。关联值通常作为参数传递给异常类的构造函数。
用户代码可以引发内置异常。这可以用于测试异常处理程序或报告错误条件“就像”解释器引发相同异常的情况; 但请注意,没有任何可以防止用户代码提出不正确的错误。
内置的异常类可以被子类化以定义新的异常; 鼓励程序员从Exception
类或其子类之一导出新的异常,而不是从BaseException
。有关定义异常的更多信息,请参见Python Tutorial中 用户定义的异常。
当提高(或重新提高)except
or finally
子句中 的异常时,__context__
会自动设置为捕获的最后一个异常; 如果未处理新的异常,则最终显示的追溯将包括始发异常和最终异常。
当提升一个新的异常(而不是使用裸raise
重新提高目前正在处理的异常),隐含的例外情况下可以通过使用补充有明确的病因from
有 raise
:
提高 new_exc 从 original_exc
以下表达式from
必须是异常或None
。它将被设置为__cause__
例外。设置 __cause__
也隐式设置__suppress_context__
属性True
,因此使用 有效地用于显示目的的新的(例如,将取代旧的例外来,同时保留现有的旧的例外内省调试时。raise new_exc from None
KeyError
AttributeError
__context__
除了异常本身的追溯之外,缺省回溯显示代码还显示了这些链接异常。一个显式链接的异常在__cause__
存在时总是显示。一个隐式链接的异常__context__
只有在__cause__
is None
和__suppress_context__
false时显示。
在任何一种情况下,异常本身总是在任何链接异常之后显示,以便traceback的最后一行始终显示最后一个引发的异常。
5.1。基类
以下异常主要用作其他异常的基类。
- 异常
BaseException
-
所有内置异常的基类。它不是直接由用户定义的类继承(为此使用
Exception
)。如果str()
在此类的实例上被调用,则返回实例的参数的表示形式,或者当没有参数时,返回空字符串。args
-
给异常构造函数的参数元组。一些内置异常(如
OSError
)期望一定数量的参数,并为此元组的元素分配一个特殊的含义,而其他异常通常仅使用单个字符串给出错误消息。
with_traceback
(tb )-
此方法将tb设置为异常的新追溯,并返回异常对象。它通常用于异常处理代码,如下所示:
try : ... except SomeException : tb = sys 。exc_info ()[ 2 ] raise OtherException (... )。with_traceback (tb )
- 异常
Exception
-
所有内置的非系统退出的异常都是从这个类派生出来的。所有用户定义的异常也应该从此类派生。
- 异常
ArithmeticError
-
对于那些内置异常的基类时引发的各种算术错误:
OverflowError
,ZeroDivisionError
,FloatingPointError
。
- 异常
BufferError
-
当无法执行缓冲区相关操作时引发。
- 异常
LookupError
-
用于当一个键或索引上的映射或序列中使用所提出的异常的基类是无效的:
IndexError
,KeyError
。这可以直接提出来codecs.lookup()
。
5.2。具体例外
以下异常是通常引发的异常。
- 异常
AssertionError
-
当
assert
声明失败时提起。
- 异常
EOFError
-
当
input()
函数达到文件结束条件(EOF)而不读取任何数据时引发。(注:在io.IOBase.read()
和io.IOBase.readline()
方法时,他们打EOF返回一个空字符串。)
- 异常
FloatingPointError
-
浮点运算失败时触发。这个异常总是定义的,但是只有当Python配置了该
--with-fpectl
选项,或者WANT_SIGFPE_HANDLER
在pyconfig.h
文件中定义了符号时,才能引发这种异常 。
- 异常
GeneratorExit
-
当发电机或协调组合关闭时提起; 看到
generator.close()
和coroutine.close()
。它直接继承BaseException
而不是,Exception
因为它在技术上不是错误。
- 异常
ImportError
-
当
import
语句在尝试加载模块时出现问题。当“从列表”中 有一个名称不能找到时,也会引发。from ... import
该
name
和path
属性可以只使用关键字参数的构造函数中设置。当设置它们分别表示尝试导入的模块的名称和触发异常的任何文件的路径。在版本3.3中更改:添加
name
和path
属性。
- 异常
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
有关何时使用的详细信息。
- 异常
OSError
([ arg ] ) - 异常
OSError
(errno,strerror [,filename [,winerror [,filename2 ] ] ] ) -
当系统函数返回与系统相关的错误(包括I / O失败,如“未找到文件”或“磁盘已满”)(不是非法参数类型或其他偶然错误)时,会引发异常。
构造函数的第二种形式设置相应的属性,如下所述。属性默认为
None
未指定。为了向后兼容,如果传递了三个参数,则该args
属性仅包含前两个构造函数参数的2元组。构造函数通常实际上返回一个子类
OSError
,如下面的操作系统异常所述。特定子类取决于最终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构造函数参数和属性。
- 异常
OverflowError
-
当算术运算的结果太大而不能被表示时提升。整数不会发生(宁可
MemoryError
放弃放弃)。但是,由于历史原因,有时会针对超出所需范围的整数引发OverflowError。由于C中浮点异常处理缺乏标准化,因此大多数浮点运算都不会被检查。
- 异常
RecursionError
-
这个异常来源于
RuntimeError
。当解释器检测到sys.getrecursionlimit()
超出最大递归深度(见)时,它会被提升 。3.5版中的新功能:以前,一个平原
RuntimeError
被提出来了。
- 异常
ReferenceError
-
当由
weakref.proxy()
函数创建的弱引用代理被用于在垃圾回收后访问引用对象的属性时引发此异常 。有关弱引用的更多信息,请参阅weakref
模块。
- 异常
RuntimeError
-
当检测到不属于任何其他类别的错误时触发。相关联的值是一个字符串,表示正确的错误。
- 异常
StopIteration
-
通过内置函数
next()
和迭代器的__next__()
方法来提示迭代器没有产生更多的项目。异常对象具有单个属性
value
,在构造异常时作为参数给出,默认为None
。当一个生成器或协同函数返回时,
StopIteration
会引发一个新的实例,函数返回的值被用作value
异常构造函数的 参数。如果在一个指令存在的情况下定义了一个生成器函数,它将被转换为(保留 为新异常的原因)。
from __future__ import generator_stop
StopIteration
RuntimeError
StopIteration
在版本3.3中更改:添加
value
属性和生成器函数使用它返回值的能力。在版本3.5中更改:引入了RuntimeError转换。
- 异常
StopAsyncIteration
-
必须通过异步迭代器对象的
__anext__()
方法 来引发,以停止迭代。3.5版新功能。
- 异常
SyntaxError
-
当解析器遇到语法错误时引发。这可能发生在一个
import
声明,调用内置的功能exec()
或eval()
阅读初始脚本或标准输入(也交互)时,或。这个类的实例有属性
filename
,lineno
,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
,退出状态为零; 如果它有另一种类型(如字符串),则打印对象的值,退出状态为一。调用
sys.exit()
被转换为异常,以便可以执行清理处理程序(finally
语句的子句try
),以便调试器可以执行脚本而不会失去控制的风险。os._exit()
如果绝对有必要立即退出(例如,在调用后的子进程中os.fork()
),则可以使用该功能。code
-
传递给构造函数的退出状态或错误消息。(默认为
None
。)
- 异常
TypeError
-
当操作或功能应用于不适当类型的对象时提起。关联值是一个字符串,提供有关类型不匹配的详细信息。
用户代码可能引发此异常,以指示对对象的尝试操作不受支持,并不意味着。如果一个对象意在支持一个给定的操作,但还没有提供一个实现,
NotImplementedError
那么正确的例外就是加注。错误类型的传递参数(例如传递
list
一个时int
,预计)应导致TypeError
,但错误的值传递参数(例如一个号码外预期边界)应导致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上可用。
5.2.1。操作系统异常
以下异常是子类OSError
,它们会根据系统错误代码引发。
- 异常
BlockingIOError
-
当操作将阻止设置为非阻塞操作的对象(例如套接字)时触发。对应于
errno
EAGAIN
,EALREADY
,EWOULDBLOCK
和EINPROGRESS
。除了那些
OSError
,BlockingIOError
可以有一个属性:characters_written
-
一个整数,包含在阻塞之前写入流的字符数。使用
io
模块中缓冲的I / O类时,此属性可用。
- 异常
ChildProcessError
-
当对子进程的操作失败时引发。对应
errno
ECHILD
。
- 异常
ConnectionError
-
连接相关问题的基础类。
子类是
BrokenPipeError
,ConnectionAbortedError
,ConnectionRefusedError
和ConnectionResetError
。
- 异常
BrokenPipeError
-
的一个子类
ConnectionError
尝试,而另一端已经关闭管道上写的时候,或者尝试这已经写入关闭套接字上写,提高。对应于errno
EPIPE
和ESHUTDOWN
。
- 异常
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
EACCES
和EPERM
。
- 异常
ProcessLookupError
-
当给定的进程不存在时提起。对应
errno
ESRCH
。
- 异常
TimeoutError
-
当系统功能在系统级别超时时引发。对应
errno
ETIMEDOUT
。
3.3版本中的新功能:OSError
添加了上述所有子类。
也可以看看
PEP 3151 - 重新编写OS和IO异常层次结构
5.3。警告
以下例外被用作警告类别; warnings
有关详细信息,请参阅该模块。
- 异常
Warning
-
警告类别的基类。
- 异常
UserWarning
-
用户代码生成的警告的基类。
- 异常
DeprecationWarning
-
关于已弃用功能的警告的基类。
- 异常
PendingDeprecationWarning
-
关于将来不推荐使用的功能的警告的基类。
- 异常
SyntaxWarning
-
关于可疑语法的警告的基类。
- 异常
RuntimeWarning
-
关于可疑运行时行为的警告的基类。
- 异常
FutureWarning
-
关于将来会在语义上改变的构造的警告的基类。
- 异常
ImportWarning
-
关于模块进口中可能出现的错误的警告的基础类。
- 异常
UnicodeWarning
-
与Unicode相关的警告的基类。
- 异常
ResourceWarning
-
与资源使用相关的警告的基类。
版本3.2中的新功能。
5.4。异常层次
内置异常的类层次结构是:
BaseException
+ - SystemExit
+ - KeyboardInterrupt
+ - GeneratorExit
+ - 异常
+ - 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