6. Built-in Exceptions

异常应该是类对象。exception 在模块exceptions中定义。无需显式导入该模块:内置名称空间和exceptions模块中都提供了异常。

对于类异常,在带有except子句的try语句中提到特定类,该子句还处理从该类派生的任何异常类(但不处理从中衍生* it *的异常类)。pass子类不相关的两个异常类即使名称相同,也永远不会等效。

下面列出的内置异常可以由解释器或内置函数生成。除非另有说明,否则它们具有“关联值”,指示错误的详细原因。这可以是包含多个信息项的字符串或 Tuples(例如,错误代码和解释该代码的字符串)。关联的值是raise语句的第二个参数。如果异常类是从标准根类BaseException派生的,则关联值显示为异常实例的args属性。

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

内置的异常类可以被子类化以定义新的异常。鼓励程序员从Exception类或其子类之一而不是BaseException派生新的异常。有关定义异常的更多信息,请参见 Python 教程中的User-defined Exceptions

以下异常仅用作其他异常的 Base Class。

  • exception BaseException
    • 所有内置异常的 Base Class。它并不意味着要由用户定义的类直接继承(为此,请使用Exception)。如果在此类的实例上调用str()unicode(),则返回该实例的参数表示形式,如果没有参数则返回空字符串。

2.5 版的新Function。

  • args

    • 给异常构造函数的参数的 Tuples。一些内置的异常(例如IOError)期望有一定数量的参数,并为此 Tuples 的元素分配特殊的含义,而其他一些异常通常仅使用给出错误消息的单个字符串来调用。
  • exception Exception

    • 所有内置的,非系统退出的异常都从此类派生。所有用户定义的异常也应从此类派生。

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

  • exception StandardError

  • exception ArithmeticError

  • exception BufferError

    • 在无法执行buffer相关操作时引发。
  • exception LookupError

  • exception EnvironmentError

    • 可能在 Python 系统外部发生的异常的 Base Class:IOErrorOSError。当使用 2Tuples 创建这种类型的异常时,第一项在实例的errno属性上可用(假定为错误号),第二项在strerror属性上可用(通常是关联的错误信息)。Tuples 本身也可以在args属性上使用。

版本 1.5.2 中的新Function。

当用 3Tuples 实例化EnvironmentError异常时,前两个项如上所述可用,而第三项在filename属性上可用。但是,为了向后兼容,args属性仅包含前两个构造函数参数的 2Tuples。

如果使用 3 个参数以外的参数创建此异常,则filename属性为None。当使用 2 或 3 个参数以外的实例创建实例时,errnostrerror属性也为None。在最后一种情况下,args包含逐字构造函数参数作为 Tuples。

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

  • exception AssertionError
    • assert语句失败时引发。
  • exception AttributeError

    • 在属性引用(请参见Attribute references)或分配失败时引发。 (当一个对象根本不支持属性引用或属性分配时,将引发TypeError。)
  • exception EOFError

  • exception FloatingPointError

    • 当浮点运算失败时引发。总是定义此异常,但是只有在使用--with-fpectl选项配置 Python 或在pyconfig.h文件中定义了WANT_SIGFPE_HANDLER符号时,才可以引发此异常。
  • exception GeneratorExit

2.5 版的新Function。

在 2.6 版中进行了更改:已更改为从BaseException继承。

  • exception IOError
    • 当 I/O 操作(例如print语句,内置open()函数或文件对象的方法)由于与 I/O 相关的原因而失败时引发,例如“找不到文件”或“磁盘已满” 。

此类是从EnvironmentError派生的。有关异常实例属性的更多信息,请参见上面的讨论。

在 2.6 版中进行了更改:更改了socket.error以将其用作 Base Class。

  • exception ImportError

    • import语句未能找到模块定义或from ... import未能找到要导入的名称时引发。
  • exception IndexError

    • 当序列下标超出范围时引发。 (切片索引会被无提示地截断以使其落在允许的范围内;如果索引不是纯整数,则会引发TypeError。)
  • exception KeyError

    • 当在现有键集中找不到 Map(字典)键时引发。
  • exception KeyboardInterrupt

    • 当用户按下break键(通常为 Control-C 或 Delete)时触发。在执行期间,会定期检查break。内置函数input()raw_input()awaitImporting 时键入的break也会引发此异常。异常继承自BaseException,以免被捕获Exception的代码意外捕获,从而防止解释器退出。

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

  • exception MemoryError

    • 在操作内存不足时引发,但这种情况仍然可以挽救(pass删除某些对象)。关联值是一个字符串,指示哪种(内部)操作用完了内存。注意,由于底层的内存 Management 体系结构(C 的malloc()函数),解释器可能无法始终完全从这种情况恢复;尽管如此,它还是引发了一个 exception,以便在导致程序失控的情况下可以打印堆栈回溯。
  • exception NameError

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

    • 此异常源自RuntimeError。在用户定义的 Base Class 中,抽象方法要求派生类重写该方法时,应引发此异常。

版本 1.5.2 中的新Function。

  • exception OSError
    • 此异常源自EnvironmentError。当函数返回与系统相关的错误(不适用于非法参数类型或其他偶然错误)时,将引发此错误。 errno属性是errno的数字错误代码,strerror属性是相应的字符串,如 C 函数perror()所打印。请参阅模块errno,其中包含基础 os 定义的错误代码的名称。

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

版本 1.5.2 中的新Function。

  • exception OverflowError

    • 在算术运算的结果太大而无法表示时引发。对于长整数(宁愿加MemoryError而不是放弃)和大多数使用纯整数的操作(返回一个长整数),都不会发生这种情况。由于 C 语言中缺乏浮点异常处理的标准化,因此大多数浮点运算也不会被检查。
  • exception ReferenceError

    • 当由weakref.proxy()函数创建的弱引用代理服务器被垃圾回收后,用于访问引用对象的属性时,会引发此异常。有关弱引用的更多信息,请参见weakref模块。

2.2 版的新Function:以前称为weakref.ReferenceError异常。

  • exception RuntimeError

    • 在检测到不属于任何其他类别的错误时引发。关联的值是一个字符串,指示确切地出错了。
  • exception StopIteration

2.2 版中的新Function。

  • exception SyntaxError
    • 在解析器遇到语法错误时引发。这可能发生在import语句,exec语句,对内置函数eval()input()的调用中,或者在读取初始脚本或标准 Importing 时(也以交互方式)。

此类的实例具有属性filenamelinenooffsettext,以便更轻松地访问详细信息。异常实例的str()仅返回消息。

  • exception IndentationError

    • 与缩进不正确相关的语法错误的 Base Class。这是SyntaxError的子类。
  • exception TabError

    • 当缩进包含制表符和空格的不一致使用时引发。这是IndentationError的子类。
  • exception SystemError

    • 在解释器发现内部错误时引发,但情况看起来并不那么严重,以致它放弃了所有希望。关联的值是一个字符串,用于指示出了什么问题(以低级术语表示)。

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

  • exception SystemExit
    • sys.exit()函数引发了此异常。不处理时,Python 解释器退出;否则,退出。不打印堆栈回溯。如果关联值是纯整数,则它指定系统退出状态(传递给 C 的exit()函数);否则,它指定系统退出状态。如果为None,则退出状态为零;如果它具有另一种类型(例如字符串),则将打印对象的值,并且退出状态为 1.

实例具有属性code,该属性设置为建议的退出状态或错误消息(默认为None)。同样,此异常直接从BaseException而不是StandardError派生,因为从技术上讲它不是错误。

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

该异常继承自BaseException而不是StandardErrorException,因此不会被捕获Exception的代码意外捕获。这样可以使异常正确传播并导致解释器退出。

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

  • exception TypeError

    • 在将操作或Function应用于不合适类型的对象时引发。关联的值是一个字符串,提供有关类型不匹配的详细信息。
  • exception UnboundLocalError

    • 在对函数或方法中的局部变量进行引用但没有值绑定到该变量时引发。这是NameError的子类。

2.0 版中的新Function。

  • exception UnicodeError
    • 在发生与 Unicode 相关的编码或解码错误时引发。它是ValueError的子类。

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

  • encoding

    • 引发错误的编码的名称。
  • reason

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

    • 编解码器try编码或解码的对象。
  • start

    • object中无效数据的第一个索引。
  • end

    • object中最后一个无效数据之后的索引。

2.0 版中的新Function。

  • exception UnicodeEncodeError
    • 在编码过程中发生与 Unicode 相关的错误时引发。它是UnicodeError的子类。

2.3 版的新Function。

  • exception UnicodeDecodeError
    • 在解码期间发生与 Unicode 相关的错误时引发。它是UnicodeError的子类。

2.3 版的新Function。

  • exception UnicodeTranslateError
    • 在翻译过程中发生 Unicode 相关错误时引发。它是UnicodeError的子类。

2.3 版的新Function。

  • exception ValueError

    • 当操作或函数接收到类型正确但值不合适的参数时引发,并且情况未由更精确的异常(例如IndexError)描述。
  • exception VMSError

    • 仅在 VMS 上可用。在发生 VMS 特定错误时引发。
  • exception WindowsError

    • 在发生 Windows 特定错误或错误编号与errno值不对应时引发。 winerrorstrerror值是根据 Windows 平台 API 的GetLastError()FormatMessage()函数的返回值创建的。 errno值将winerror值 Map 到相应的errno.h值。这是OSError的子类。

2.0 版中的新Function。

在版本 2.5 中进行了更改:以前的版本将GetLastError()代码放入errno

  • exception ZeroDivisionError
    • 当除法或模运算的第二个自变量为零时引发。关联值是一个字符串,指示操作数和操作的类型。

以下 exception 用作警告类别;有关更多信息,请参见warnings模块。

  • exception Warning

    • 警告类别的 Base Class。
  • exception UserWarning

    • 用户代码生成的警告的 Base Class。
  • exception DeprecationWarning

    • 有关不推荐使用的Function的警告的 Base Class。
  • exception PendingDeprecationWarning

    • 有关将来将不推荐使用的Function的警告的 Base Class。
  • exception SyntaxWarning

    • 警告有关可疑语法的 Base Class。
  • exception RuntimeWarning

    • 警告有关可疑运行时行为的 Base Class。
  • exception FutureWarning

    • 警告有关 Base Class 的 Base Class,这些结构将来会在语义上发生变化。
  • exception ImportWarning

    • 用于警告有关模块导入中可能错误的警告的 Base Class。

2.5 版的新Function。

  • exception UnicodeWarning
    • 与 Unicode 相关的警告的 Base Class。

2.5 版的新Function。

  • exception BytesWarning
    • 与字节和字节数组有关的警告的 Base Class。

2.6 版的新Function。

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