### 6. 内建的异常
异常应该是类对象。异常定义在模块[exceptions](# "exceptions: Standard exception classes.")中。该模块不需要显式导入:这些异常在内置命名空间中有提供,就和[exceptions](# "exceptions: Standard exception classes.")模块一样。
对于类异常,如果在[try](#)语句的[except](#)子句中提到一个类,该子句还会处理任何从那个类派生的异常类(不是*它*派生自的异常类)。通过子类化得到的两个不相关的异常类永远不会相等,即使它们具有相同的名称。
下面列出的异常可以通过解释器或内置函数生成。除了提到的那些地方,它们还有"相关联的值"指示错误的详细的原因。它可能是一个字符串或一个包含几项信息(例如,错误码和解释代码的字符串)的元组。关联的值为[raise](#)语句的第二个参数。如果异常类派生自标准的根类[BaseException](# "exceptions.BaseException"),关联的值作为异常实例的args属性呈现。
用户代码可以引发内置异常。这可以用来测试异常处理程序或报告一个错误情况,"就像"这种情况下解释器引起的相同异常;但要注意没有办法能阻止用户代码引发一个不当的错误。
内置的异常类可以创建子类来定义新的异常;程序员应该从[Exception](# "exceptions.Exception")类或它的一个子类而不是从[BaseException](# "exceptions.BaseException")派生新的异常。有关定义异常详细信息可以访问Python 教程中的[*用户定义的异常*](#)。
以下的异常只用作其它异常的基类。
*exception*BaseException
所有内建的异常的基类。它并不意味用户定义的类应该直接继承它(为此,请使用[Exception](# "exceptions.Exception"))。如果在该类的一个实例上调用[str()](# "str")或[unicode()](# "unicode"),则返回该实例的参数的表示,没有参数时返回空字符串。
版本2.5中新增。
args
异常构造函数的参数元组。有些内建的异常(如[IOError](# "exceptions.IOError"))期望一定数量的参数并为此元组的元素分配特殊的含义,而其它异常的调用通常只需要一个单一的字符串来提供一条错误消息。
*exception*Exception
所有内置的、 非系统退出异常是从该类派生的。此外应该从该类派生所有用户定义的异常。
2.5 版本中的更改:更改为从[BaseException](# "exceptions.BaseException")继承。
*exception*StandardError
除[StopIteration](# "exceptions.StopIteration")、[GeneratorExit](# "exceptions.GeneratorExit")、[KeyboardInterrupt](# "exceptions.KeyboardInterrupt")和[SystemExit](# "exceptions.SystemExit")以外的所有内置异常的基类。[StandardError](# "exceptions.StandardError")本身继承自[Exception](# "exceptions.Exception")。
*exception*ArithmeticError
各种算术错误引发的内置异常的基类:[OverflowError](# "exceptions.OverflowError")、[ZeroDivisionError](# "exceptions.ZeroDivisionError")、[FloatingPointError](# "exceptions.FloatingPointError")。
*exception*BufferError
当[*缓冲区*](#)相关的操作无法执行时引发。
*exception*LookupError
当用于映射或序列的键或索引无效时引发的异常的基类:[IndexError](# "exceptions.IndexError")、[KeyError](# "exceptions.KeyError")。可以直接通过[codecs.lookup()](# "codecs.lookup")引发。
*exception*EnvironmentError
Python系统以外发生的异常的基类:[IOError](# "exceptions.IOError")、[OSError](# "exceptions.OSError")。当用2元组创建这种类型的异常时,第一项可以通过实例的[errno](# "errno: Standard errno system symbols.")属性访问(它被假设为一个错误编号),第二个项目是可通过strerror属性访问(它通常与错误消息关联)。元组本身也是可用的args属性上的。
1.5.2 版中新增。
[EnvironmentError](# "exceptions.EnvironmentError")异常以3元组实例化时,前两项的访问和上面一样,第三项可以通过filename属性访问。然而,对于向后兼容性, args属性包含仅 2 元第一次的两个构造函数参数。
当该异常以非3个参数创建时,filename属性为None。当实例不是以2个或3个参数创建时,[errno](# "errno: Standard errno system symbols.")和strerror属性也为None。在最后一种情况下, args以一个元组的形式包含构造函数的原样参数。
以下是实际中会引发的异常。
*exception*AssertionError
当[assert](#)语句将失败时引发。
*exception*AttributeError
当属性引用 (请参见[*属性引用*](#)) 或分配失败。(当对象不支持属性引用或根本属性分配时, [TypeError](# "exceptions.TypeError")将引发。)
*exception*EOFError
当 ([input ()](# "input")或[raw_input()](# "raw_input")) 的内置函数之一点击文件结尾 (EOF) 条件下没有读取任何数据时引发。(注: [file.read()](# "file.read")和[file.readline()](# "file.readline")的方法返回一个空字符串,当他们击中 EOF。)
*exception*FloatingPointError
提出当浮动点操作将失败。此异常其始终定义,但可以当 Python 配置与时的情况下,才会引发— — fpectl 与选项或WANT_SIGFPE_HANDLER符号在pyconfig.h文件中定义。
*exception*GeneratorExit
当调用一种[*发电机*](#)的close ()方法时引发。它直接继承而不是[StandardError](# "exceptions.StandardError")[BaseException](# "exceptions.BaseException") ,因为它是从技术上讲不是一个错误。
新版本 2.5 中的。
2.6 版本中的更改:更改为从[BaseException](# "exceptions.BaseException")继承。
*exception*IOError
O 相关的原因,例如,"未找到文件"或"磁盘已满"(如[print](#)语句、 内置[open ()](# "open")函数或文件对象的方法) 的 I/O 操作失败时引发。
此类是从[EnvironmentError](# "exceptions.EnvironmentError")派生的。异常实例属性请参阅上文讨论的详细信息。
2.6 版本中的更改:改变[socket.error](# "socket.error")把此作为基类。
*exception*ImportError
当[import](#)语句无法找到模块定义或者时从......引发导入未能找到要导入的名称。
*exception*IndexError
序列下标超出范围时引发。(切片索引会被自动截断落在允许的范围内 ; 如果索引不是一个普通整数,则引发[TypeError](# "exceptions.TypeError") )。
*exception*KeyError
在现有的键的集合中找不到 (词典) 的映射键时引发。
*exception*KeyboardInterrupt
当用户点击中断键 (通常控制 C或删除) 时引发。在执行期间,从理论上进行定期检查的中断。中断类型,当一个内置函数[的 input ()](# "input")或[raw_input()](# "raw_input")等待输入还引发此异常。异常继承[BaseException](# "exceptions.BaseException") ,不意外地被捕获[的异常](# "exceptions.Exception")的代码捕捉,从而防止该解释器退出。
2.5 版本中的更改:更改为从[BaseException](# "exceptions.BaseException")继承。
*exception*MemoryError
当操作耗尽了内存,但情况仍可能获救 (通过删除一些对象) 时引发。关联的值是一个字符串,指示什么样的 (内部) 操作耗尽了内存。请注意由于底层内存管理结构 (C 的malloc ()函数),口译员未必能够完全恢复从这种情况 ;它然而引发异常以便可以打印堆栈回溯,离家出走的程序令的情况下。
*exception*NameError
当找不到本地或全局名称时引发。这仅适用于不合格的名称。关联的值是一条错误消息,其中包括找不到的名称。
*exception*NotImplementedError
此异常是从[RuntimeError](# "exceptions.RuntimeError")派生的。用户定义基类中抽象方法应引发异常,当他们要求派生的类重写该方法。
在 1.5.2 版本新。
*exception*OSError
此异常是从[EnvironmentError](# "exceptions.EnvironmentError")派生的。它被提出当一个函数返回与系统相关的错误 (不是非法的参数类型或其他附带的错误)。[Errno](# "errno: Standard errno system symbols.")属性是从errno,一个数字错误代码, strerror属性是相应的字符串,将印的 C 函数perror ()。请参阅模块[errno](# "errno: Standard errno system symbols."),其中包含由底层操作系统定义的错误代码的名称。
对于涉及 (如chdir()或作用是:) 的文件系统路径的异常,异常实例将包含三个属性,文件名,这是传递给函数的文件的名称。
在 1.5.2 版本新。
*exception*OverflowError
太大而无法表示算术运算的结果时引发。长整数 (这比放弃,而是会引起[MemoryError](# "exceptions.MemoryError") ),与普通的整数,而是返回一个长整数的大多数操作,就不能发生这种情况。缺乏标准化的浮动点中的异常处理 C,最浮点运算也不会检查。
*exception*ReferenceError
弱引用代理,由[weakref.proxy()](# "weakref.proxy")函数中,创建用于访问属性的指涉后它已被垃圾回收, 时,将引发此异常。弱引用的详细信息,请参阅[weakref](# "weakref: Support for weak references and weak dictionaries.")模块。
新版本 2.2 中的:以前称为[weakref。](# "weakref.ReferenceError")ReferenceError异常。
*exception*RuntimeError
这不会在任何其他类别中检测到错误时引发。关联的值是一个字符串,指示什么精确地走错了。
*exception*StopIteration
提出的[*迭代器*](#)的[next ()](# "iterator.next")方法,信号说那里是没有进一步的值。这是[例外](# "exceptions.Exception"),而不是[StandardError](# "exceptions.StandardError"),从推导出来的因为这被认为是一种不在其正常的应用程序中的错误。
新版本 2.2 中的。
*exception*SyntaxError
当解析器遇到语法错误时引发。阅读的最初的脚本或标准输入 (也是以交互方式) 时,这可能发生在[exec](#)语句中调用内置函数[eval ()](# "eval")或[input ()](# "input"),或[导入](#)的语句中。
此类的实例有属性文件名、空格符、偏移量和更容易访问详细信息的文本。[str()](# "str")的异常实例返回唯一的消息。
*exception*IndentationError
与相关的缩进不正确的语法错误的基类。这是[SyntaxError](# "exceptions.SyntaxError")的一个子类。
*exception*TabError
当压痕包含制表符和空格的使用不一致时引发。这是[IndentationError](# "exceptions.IndentationError")的一个子类。
*exception*SystemError
当译员发现内部错误,但情况看起来不那么严重,使它不得不放弃所有希望时引发。关联的值是一个字符串,指示发生错误 (在底层的角度来说)。
你应该向作者或维护者你 Python 解释器报告。一定要报告的 Python 解释器版本 (sys.version; 它也印在 Python 的交互式会话开始时),确切的错误消息 (异常的关联值),如果可能的程序源代码,触发错误。
*exception*SystemExit
由[sys.exit()](# "sys.exit")函数引发此异常。当它不处理时,Python 解释器退出 ;打印没有堆栈回溯。如果关联的值是一个普通整数,它指定系统退出状态 (传递给 C 的exit()函数) ;如果它是None,退出状态为零 ;如果它有另一种类型 (如字符串),该对象的值印,退出状态是一个。
实例具有的属性代码设置为 (默认情况下没有) 拟议的退出状态或错误消息。此外,此异常派生直接从[BaseException](# "exceptions.BaseException")和不[StandardError](# "exceptions.StandardError"),因为它不是技术上的错误。
对[sys.exit()](# "sys.exit")的调用被翻译成异常,以便可以执行清理处理程序 ([最后](#)条款[try](#)语句),并且,以便调试器可以执行一个脚本不运行失控的风险。如果它是绝对有必要退出立即 (例如,在子进程后对[os.fork()](# "os.fork")的调用),可以使用[os._exit()](# "os._exit")函数。
异常继承[BaseException](# "exceptions.BaseException")而不是[StandardError](# "exceptions.StandardError")或[异常](# "exceptions.Exception"),以便不意外地被捕获[的异常](# "exceptions.Exception")的代码。这允许将异常正确传播起来并导致该解释器退出。
2.5 版本中的更改:更改为从[BaseException](# "exceptions.BaseException")继承。
*exception*TypeError
当操作或函数应用于不合适类型的对象时引发。关联的值是字符串,它提供有关类型不匹配的详细信息。
*exception*UnboundLocalError
当提及到一个本地变量在函数或方法,但没有值已绑定到该变量时引发。这是[NameError](# "exceptions.NameError")的一个子类。
在 2.0 版中的新。
*exception*UnicodeError
有关 Unicode 编码或解码错误出现时引发。它是[ValueError](# "exceptions.ValueError")的一个子类。
[UnicodeError](# "exceptions.UnicodeError")具有描述编码或解码错误的属性。例如, err.object[err.start:err.end]给出了所编解码器的失败与特定的无效输入。
encoding
引发错误编码的名称。
reason
描述特定的编码解码器错误的字符串。
object
编解码器对象试图进行编码或解码。
start
第一个索引的[对象](# "object")中的数据无效。
end
后最后一个无效的数据[对象](# "object")中的索引。
在 2.0 版中的新。
*exception*UnicodeEncodeError
编码过程中出现的一个 Unicode 相关的错误时引发。它是[UnicodeError](# "exceptions.UnicodeError")的一个子类。
新版本 2.3。
*exception*UnicodeDecodeError
解码过程中出现的一个 Unicode 相关的错误时引发。它是[UnicodeError](# "exceptions.UnicodeError")的一个子类。
新版本 2.3。
*exception*UnicodeTranslateError
在翻译过程中出现的一个 Unicode 相关的错误时引发。它是[UnicodeError](# "exceptions.UnicodeError")的一个子类。
新版本 2.3。
*exception*ValueError
当内置操作或功能接收具有正确的类型,但不正确的值,这样一种说法,这种情况不描述的更精确异常 (如[IndexError](# "exceptions.IndexError")时引发。
*exception*VMSError
仅在 VM 上可用。当 VM 特定错误时引发。
*exception*WindowsError
Windows 特定的错误发生时,或者是错误号码不对应errno值时引发。Winerror和strerror的值创建的GetLastError()和FormatMessage()的功能,从 Windows 平台 API 的返回值。[Errno](# "errno: Standard errno system symbols.")值将winerror值映射到相应的errno.h值。这是[OSError](# "exceptions.OSError")的一个子类。
在 2.0 版中的新。
2.5 版本中的更改:以前的版本放入[errno](# "errno: Standard errno system symbols.")的GetLastError()代码。
*exception*ZeroDivisionError
当一个司或取模操作的第二个参数是零时引发。关联的值是一个字符串,指示的操作数和操作的类型。
以下异常作为警告类别使用;详细信息请参阅[warnings](# "warnings: Issue warning messages and control their disposition.")模块。
*exception*Warning
警告类的基类。
*exception*UserWarning
对于由用户代码生成警告的基类。
*exception*DeprecationWarning
有关已弃用功能的警告的基类。
*exception*PendingDeprecationWarning
警告有关将在未来被否决的功能的基类。
*exception*SyntaxWarning
警告有关可疑语法的基类
*exception*RuntimeWarning
基类有关可疑的运行时行为的警告。
*exception*FutureWarning
基类构造,它们会在未来发生语义变化有关的警告。
*exception*ImportWarning
导入模块中可能错误的警告的基类。
2.5 版中新增。
*exception*UnicodeWarning
Unicode相关的警告的基类。
2.5 版中新增。
### 6.1. 异常的层次结构
内置异常的类层次结构是:
~~~
BaseException
+-- SystemExit
+-- KeyboardInterrupt
+-- GeneratorExit
+-- Exception
+-- StopIteration
+-- StandardError
| +-- BufferError
| +-- ArithmeticError
| | +-- FloatingPointError
| | +-- OverflowError
| | +-- ZeroDivisionError
| +-- AssertionError
| +-- AttributeError
| +-- EnvironmentError
| | +-- IOError
| | +-- OSError
| | +-- WindowsError (Windows)
| | +-- VMSError (VMS)
| +-- EOFError
| +-- ImportError
| +-- LookupError
| | +-- IndexError
| | +-- KeyError
| +-- MemoryError
| +-- NameError
| | +-- UnboundLocalError
| +-- ReferenceError
| +-- RuntimeError
| | +-- NotImplementedError
| +-- SyntaxError
| | +-- IndentationError
| | +-- TabError
| +-- SystemError
| +-- TypeError
| +-- ValueError
| +-- UnicodeError
| +-- UnicodeDecodeError
| +-- UnicodeEncodeError
| +-- UnicodeTranslateError
+-- Warning
+-- DeprecationWarning
+-- PendingDeprecationWarning
+-- RuntimeWarning
+-- SyntaxWarning
+-- UserWarning
+-- FutureWarning
+-- ImportWarning
+-- UnicodeWarning
+-- BytesWarning
~~~
- Python 2 教程
- 1. 吊吊你的胃口
- 2. Python 解释器
- 3. Python简介
- 4. 控制流
- 5. 数据结构
- 6. 模块
- 7. 输入和输出
- 8. 错误和异常
- 9. 类
- 10. 标准库概览
- 11. 标准库概览 — 第II部分
- 12.现在怎么办?
- 13. 交互式输入的编辑和历史记录
- 14. 浮点数运算:问题和局限
- Python 2 标准库
- 1. 引言
- 2. 内建函数
- 3. 不太重要的内建函数
- 4. 内建的常量
- 5. 内建的类型
- 6. 内建的异常
- 7. String Services
- 8. Data Types
- 9. Numeric and Mathematical Modules
- 10. File and Directory Access
- 11. Data Persistence
- 13. File Formats
- 14. Cryptographic Services
- 15. Generic Operating System Services
- 16. Optional Operating System Services
- 17. Interprocess Communication and Networking
- 18. Internet Data Handling
- 20. Internet Protocols and Support
- 26. Debugging and Profiling
- 28. Python Runtime Services
- Python 2 语言参考
- 1. 简介
- 2. 词法分析
- 3. 数据模型
- 4. 执行模型
- 5. 表达式
- 6. 简单语句
- 7. 复合语句
- 8. 顶层的组件
- 9. 完整的语法规范
- Python 3 教程
- 1. 引言
- 2. Python 解释器
- 3. Python简介
- 4. 控制流
- 5. 数据结构
- 6. 模块
- 7. 输入和输出
- 8. 错误和异常
- 9. 类
- 10. 标准库概览
- 11. 标准库概览 — 第II部分
- 12.现在怎么办?
- 13. 交互式输入的编辑和历史记录
- 14. 浮点数运算:问题和局限