6. 内建的异常

异常应该是类对象。异常定义在模块exceptions中。该模块不需要显式导入:这些异常在内置命名空间中有提供,就和exceptions模块一样。

对于类异常,如果在try语句的except子句中提到一个类,该子句还会处理任何从那个类派生的异常类(不是派生自的异常类)。通过子类化得到的两个不相关的异常类永远不会相等,即使它们具有相同的名称。

下面列出的异常可以通过解释器或内置函数生成。除了提到的那些地方,它们还有"相关联的值"指示错误的详细的原因。它可能是一个字符串或一个包含几项信息(例如,错误码和解释代码的字符串)的元组。关联的值为raise语句的第二个参数。如果异常类派生自标准的根类BaseException,关联的值作为异常实例的args属性呈现。

用户代码可以引发内置异常。这可以用来测试异常处理程序或报告一个错误情况,"就像"这种情况下解释器引起的相同异常;但要注意没有办法能阻止用户代码引发一个不当的错误。

内置的异常类可以创建子类来定义新的异常;程序员应该从Exception类或它的一个子类而不是从BaseException派生新的异常。有关定义异常详细信息可以访问Python 教程中的用户定义的异常

以下的异常只用作其它异常的基类。

exceptionBaseException 所有内建的异常的基类。它并不意味用户定义的类应该直接继承它(为此,请使用Exception)。如果在该类的一个实例上调用str()unicode(),则返回该实例的参数的表示,没有参数时返回空字符串。

版本2.5中新增。

args 异常构造函数的参数元组。有些内建的异常(如IOError)期望一定数量的参数并为此元组的元素分配特殊的含义,而其它异常的调用通常只需要一个单一的字符串来提供一条错误消息。

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

2.5 版本中的更改:更改为从BaseException继承。

exceptionStandardError 除StopIterationGeneratorExitKeyboardInterruptSystemExit以外的所有内置异常的基类。StandardError本身继承自Exception

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

exceptionBufferError 当缓冲区相关的操作无法执行时引发。

exceptionLookupError 当用于映射或序列的键或索引无效时引发的异常的基类:IndexErrorKeyError。可以直接通过codecs.lookup()引发。

exceptionEnvironmentError Python系统以外发生的异常的基类:IOErrorOSError。当用2元组创建这种类型的异常时,第一项可以通过实例的errno属性访问(它被假设为一个错误编号),第二个项目是可通过strerror属性访问(它通常与错误消息关联)。元组本身也是可用的args属性上的。

1.5.2 版中新增。

EnvironmentError异常以3元组实例化时,前两项的访问和上面一样,第三项可以通过filename属性访问。然而,对于向后兼容性, args属性包含仅 2 元第一次的两个构造函数参数。

当该异常以非3个参数创建时,filename属性为None。当实例不是以2个或3个参数创建时,errno和strerror属性也为None。在最后一种情况下, args以一个元组的形式包含构造函数的原样参数。

以下是实际中会引发的异常。

exceptionAssertionError 当assert语句将失败时引发。

exceptionAttributeError 当属性引用 (请参见属性引用) 或分配失败。(当对象不支持属性引用或根本属性分配时, TypeError将引发。)

exceptionEOFError 当 (input ()raw_input()) 的内置函数之一点击文件结尾 (EOF) 条件下没有读取任何数据时引发。(注: file.read()file.readline()的方法返回一个空字符串,当他们击中 EOF。)

exceptionFloatingPointError 提出当浮动点操作将失败。此异常其始终定义,但可以当 Python 配置与时的情况下,才会引发— — fpectl 与选项或WANT_SIGFPE_HANDLER符号在pyconfig.h文件中定义。

exceptionGeneratorExit 当调用一种发电机的close ()方法时引发。它直接继承而不是StandardErrorBaseException ,因为它是从技术上讲不是一个错误。

新版本 2.5 中的。

2.6 版本中的更改:更改为从BaseException继承。

exceptionIOError O 相关的原因,例如,"未找到文件"或"磁盘已满"(如print语句、 内置open ()函数或文件对象的方法) 的 I/O 操作失败时引发。

此类是从EnvironmentError派生的。异常实例属性请参阅上文讨论的详细信息。

2.6 版本中的更改:改变socket.error把此作为基类。

exceptionImportError 当import语句无法找到模块定义或者时从......引发导入未能找到要导入的名称。

exceptionIndexError 序列下标超出范围时引发。(切片索引会被自动截断落在允许的范围内 ; 如果索引不是一个普通整数,则引发TypeError )。

exceptionKeyError 在现有的键的集合中找不到 (词典) 的映射键时引发。

exceptionKeyboardInterrupt 当用户点击中断键 (通常控制 C或删除) 时引发。在执行期间,从理论上进行定期检查的中断。中断类型,当一个内置函数的 input ()raw_input()等待输入还引发此异常。异常继承BaseException ,不意外地被捕获的异常的代码捕捉,从而防止该解释器退出。

2.5 版本中的更改:更改为从BaseException继承。

exceptionMemoryError 当操作耗尽了内存,但情况仍可能获救 (通过删除一些对象) 时引发。关联的值是一个字符串,指示什么样的 (内部) 操作耗尽了内存。请注意由于底层内存管理结构 (C 的malloc ()函数),口译员未必能够完全恢复从这种情况 ;它然而引发异常以便可以打印堆栈回溯,离家出走的程序令的情况下。

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

exceptionNotImplementedError 此异常是从RuntimeError派生的。用户定义基类中抽象方法应引发异常,当他们要求派生的类重写该方法。

在 1.5.2 版本新。

exceptionOSError 此异常是从EnvironmentError派生的。它被提出当一个函数返回与系统相关的错误 (不是非法的参数类型或其他附带的错误)。Errno属性是从errno,一个数字错误代码, strerror属性是相应的字符串,将印的 C 函数perror ()。请参阅模块errno,其中包含由底层操作系统定义的错误代码的名称。

对于涉及 (如chdir()或作用是:) 的文件系统路径的异常,异常实例将包含三个属性,文件名,这是传递给函数的文件的名称。

在 1.5.2 版本新。

exceptionOverflowError 太大而无法表示算术运算的结果时引发。长整数 (这比放弃,而是会引起MemoryError ),与普通的整数,而是返回一个长整数的大多数操作,就不能发生这种情况。缺乏标准化的浮动点中的异常处理 C,最浮点运算也不会检查。

exceptionReferenceError 弱引用代理,由weakref.proxy()函数中,创建用于访问属性的指涉后它已被垃圾回收, 时,将引发此异常。弱引用的详细信息,请参阅weakref模块。

新版本 2.2 中的:以前称为weakref。ReferenceError异常。

exceptionRuntimeError 这不会在任何其他类别中检测到错误时引发。关联的值是一个字符串,指示什么精确地走错了。

exceptionStopIteration 提出的迭代器next ()方法,信号说那里是没有进一步的值。这是例外,而不是StandardError,从推导出来的因为这被认为是一种不在其正常的应用程序中的错误。

新版本 2.2 中的。

exceptionSyntaxError 当解析器遇到语法错误时引发。阅读的最初的脚本或标准输入 (也是以交互方式) 时,这可能发生在exec语句中调用内置函数eval ()input (),或导入的语句中。

此类的实例有属性文件名、空格符、偏移量和更容易访问详细信息的文本。str()的异常实例返回唯一的消息。

exceptionIndentationError 与相关的缩进不正确的语法错误的基类。这是SyntaxError的一个子类。

exceptionTabError 当压痕包含制表符和空格的使用不一致时引发。这是IndentationError的一个子类。

exceptionSystemError 当译员发现内部错误,但情况看起来不那么严重,使它不得不放弃所有希望时引发。关联的值是一个字符串,指示发生错误 (在底层的角度来说)。

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

exceptionSystemExit 由sys.exit()函数引发此异常。当它不处理时,Python 解释器退出 ;打印没有堆栈回溯。如果关联的值是一个普通整数,它指定系统退出状态 (传递给 C 的exit()函数) ;如果它是None,退出状态为零 ;如果它有另一种类型 (如字符串),该对象的值印,退出状态是一个。

实例具有的属性代码设置为 (默认情况下没有) 拟议的退出状态或错误消息。此外,此异常派生直接从BaseException和不StandardError,因为它不是技术上的错误。

sys.exit()的调用被翻译成异常,以便可以执行清理处理程序 (最后条款try语句),并且,以便调试器可以执行一个脚本不运行失控的风险。如果它是绝对有必要退出立即 (例如,在子进程后对os.fork()的调用),可以使用os._exit()函数。

异常继承BaseException而不是StandardError异常,以便不意外地被捕获的异常的代码。这允许将异常正确传播起来并导致该解释器退出。

2.5 版本中的更改:更改为从BaseException继承。

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

exceptionUnboundLocalError 当提及到一个本地变量在函数或方法,但没有值已绑定到该变量时引发。这是NameError的一个子类。

在 2.0 版中的新。

exceptionUnicodeError 有关 Unicode 编码或解码错误出现时引发。它是ValueError的一个子类。

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

encoding 引发错误编码的名称。

reason 描述特定的编码解码器错误的字符串。

object 编解码器对象试图进行编码或解码。

start 第一个索引的对象中的数据无效。

end 后最后一个无效的数据对象中的索引。

在 2.0 版中的新。

exceptionUnicodeEncodeError 编码过程中出现的一个 Unicode 相关的错误时引发。它是UnicodeError的一个子类。

新版本 2.3。

exceptionUnicodeDecodeError 解码过程中出现的一个 Unicode 相关的错误时引发。它是UnicodeError的一个子类。

新版本 2.3。

exceptionUnicodeTranslateError 在翻译过程中出现的一个 Unicode 相关的错误时引发。它是UnicodeError的一个子类。

新版本 2.3。

exceptionValueError 当内置操作或功能接收具有正确的类型,但不正确的值,这样一种说法,这种情况不描述的更精确异常 (如IndexError时引发。

exceptionVMSError 仅在 VM 上可用。当 VM 特定错误时引发。

exceptionWindowsError Windows 特定的错误发生时,或者是错误号码不对应errno值时引发。Winerror和strerror的值创建的GetLastError()和FormatMessage()的功能,从 Windows 平台 API 的返回值。Errno值将winerror值映射到相应的errno.h值。这是OSError的一个子类。

在 2.0 版中的新。

2.5 版本中的更改:以前的版本放入errno的GetLastError()代码。

exceptionZeroDivisionError 当一个司或取模操作的第二个参数是零时引发。关联的值是一个字符串,指示的操作数和操作的类型。

以下异常作为警告类别使用;详细信息请参阅warnings模块。

exceptionWarning 警告类的基类。

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

exceptionDeprecationWarning 有关已弃用功能的警告的基类。

exceptionPendingDeprecationWarning 警告有关将在未来被否决的功能的基类。

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

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

exceptionFutureWarning 基类构造,它们会在未来发生语义变化有关的警告。

exceptionImportWarning 导入模块中可能错误的警告的基类。

2.5 版中新增。

exceptionUnicodeWarning 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