余弦:我没看过python的书,但我通读过python文档。文档不过一遍,视野会局限。 近日读sqlmap源码,发现自己对于标准库所知甚少,想到knownsec技能表中余弦的一番话,加之最近有意提升English能力,遂意通读python2.7.13官方文档,去粗取精,译成中文,国内虽有一译站点已有翻译,但为参考。然本钱平平,词不达意,技止于此,望看客海涵。

Python标准库-内置异常

异常应该是类对象。异常在exceptions模块中定义。该模块从不需要被显示导入:异常由内置命名空间提供,和exceptions模块一样。

对于类异常,在try-catch语句体中如果涉及了一个类,则也会处理任何派生自该类的异常类(不是它派生于的那些类)。通过子类化得到的两个不相关的异常类永远不会相等,即便它们具有相同名称。

下面列出的内置异常可以被解释器或内置函数生成。除了提到的那些,它们还有一个“关联值”用于指示错误的详情。他可能是一个字符串或包含多个信息的元组(例如:一个错误码和一个解释该码的字符串)。关联值作为raise语句的第二个参数。如果异常类由标准根类BaseException派生,关联值会以异常实例的args属性表示。

用户代码可以引起内置异常。这可以用来测试异常处理程序或报告一个错误情形,就像解释器在此情景下抛异常一样;但要注意没有什么可以阻止用户代码抛一个不合理的错误。

内置异常类可以被继承来定义新的异常;程序员被鼓励去继承一个或多个异常类来产生新的异常类,且不是从BaseException继承。更多信息关于异常的定义可以在python手册中的“用户定义异常”中找到。

  • exception BaseException
    • 所有内置异常类的基类。这并不意味着用户自定义类应该直接继承它(请使用Exception)。如果str()和unicode()在类的实例上调用,则会返回该实例的参数表示,如果没有参数就返回空串。
    • python2.5新增
    • args
      • 异常构造器的元组参数。一些内置异常(如IOError)期望一个确定的参数数量并分配给该元组的元素特殊的意义,而其他异常的调用通常只需要一个单一的字符串来提供一条错误信息。
  • exception Exception
    • 所有内置的,非系统退出的异常都继承自这个类。所有用户定义异常应该继承这个类。
    • 2.5中改变:改从BaseException继承。
  • exception StandardError
    • 所有内置异常类的基类,除了StopIteration,GeneratorExit,KeyboardInterrupt和SystemExit.StandardError本身继承自Exception。
  • exception ArithmeticError
    • 各种算术错误引发的内置异常基类:OverflowError,ZeroDivisionError,FloatingPointError。
  • exception BufferError
    • 当buffer相关操作无法执行时引发。
  • exception LookupError
    • 当映射的键或序列的索引无效时引发的异常基类:IndexError, KeyError。可以通过codecs.lookup()直接引发。
  • exception EnvironmentError
    • python系统以外发生的异常的基类:IOError,OSError。当用二元组创建这种类型的异常时,元组的第一项可以通过实例的errno属性访问(它被假设为一个错误编号),第二项可以通过stderror属性访问(通常与错误消息关联)。元组本身可以用在args属性上。
    • 1.5.2新增。
    • 当一个EnvironmentError异常以三元组实例化,前两项的访问和上面一样,第三项可以通过filename属性访问。然而,为了保持向后兼容,args属性仅包含二元组,用来放置前两个构造函数参数。
    • 当异常不以三元组创建时,filename属性是None。当异常实例不以2或3个参数创建时,errno和strerror属性也为None。在最后一种情况下,args以一个元组的形式,包含逐字的构造函数参数。

下面是实际会触发的异常。

  • exception AssertionError
    • 当assert语句失败时引发。
  • exception AttributeError
    • 当属性引用或赋值失败时抛出。(当对象根本不支持属性引用或属性赋值时,抛TypeError。)
  • exception EOFError
    • 当内建函数在读取数据时命中EOF抛出。
  • exception FloatingPointError
    • 当浮点数操作失败时引发。该异常总是被定义的,但仅当python用–with-fpect选项配置时,或当pyconfig.h中定义了WANT_SIGFPE_HANDLER符号时才会引发。
  • exception GeneratorExit
    • 当生成器对象的close()方法被调用时引发。它直接继承自BaseException而不是StandardError,因为技术上来说,这不是个错误。
    • 2.5新增。
    • 2.6改变:改从BaseException继承。
  • exception IOError
    • 当一个I/O操作失败(如print语句,内置open()函数,或调用一个文件对象的方法),由于I/O相关原因导致失败,即未找到或磁盘已满时抛该异常。
    • 此类继承自EnvironmentError。异常实例属性请参考上文的讨论信息。
    • 2.6改变:修改socket.error用此类做基类。
  • exception ImportError
    • 当import语句没有找到模块定义或from ... import寻找名字失败时,抛该异常。
  • exception IndexError
    • 当一个序列下标超出范围时抛异常。(切片索引会被静默地截取到允许的范围,如果索引不是一个一般整数,抛TypeError。)
  • exception KeyError
    • 当一个映射键在已有存在键集中没找到时,抛出。
  • exception KeyboardInterrupt
    • 当用户命中中断键(通常是Ctrl+C或Delete)时抛出。在执行期间,会定期检查中断。当内置函数input()或raw_input()阻塞时,输入中断键也会抛该异常。该异常继承自BaseException,因此不会被Exception捕获,以防止解释器退出。
    • 2.5更改:继承自BaseException。
  • exception MemoryError
    • 当一个操作将内存耗尽,但情况仍可挽救时(通过删除一些对象)引发。关联值是一个字符串指示了哪种(内部)操作耗尽了内存。注意到因为底层内存管理架构(C的malloc()函数),解释器不可能总是能从这种情况中恢复;它仍然会发生异常,以打印栈回溯,防止程序跑飞。
  • exception NameError
    • 当局部或全局名字没有找到时抛出。这仅适用于不合格的名称。关联值是一条错误消息,其中包括找不到的名称。
  • exception NotImplementedError
    • 继承自RuntimeError。在用户自定义基类需要派生类重写方法时,抽象方法会引发该异常。
    • 1.5.2新增。
  • exception OSError
    • 继承自EnvironmentError。当一个函数返回系统相关错误时引发(非法参数类型或其他偶然类型错误除外)。errno属性是个数值错误码,属性strerror是相应的字符串,和C的函数perror()打印的相同。更多底层内容可以查看errno模块。
    • 对涉及到文件系统路径(chdir()或unlink())的异常来说,异常实例包含第三个属性,filename,它是传递个函数的文件名。
    • 1.5.2新增。
  • exception OverflowError
    • 当算术运算结果太大无法表示时引发。长整型数字不会导致该异常(长整性引发MemoryError而不会放弃);普通整型数字也不会导致该异常,作为替代,他返回一个长整型。由于C缺乏标准浮点数异常处理,因此,不会检查大部分浮点数运算。
  • exception ReferenceError
    • 当weakref.proxy()创建的弱引用代理访问引用者属性,而该引用者已经被回收掉时,抛出。更多信息参考weakref模块。
    • 2.2新增:此前用weakref.ReferenceError异常。
  • exception RuntimeError
    • 当一个错误被检测且不属于其他类别时引发。关联值是一个字符串,它指示具体的错误位置。
    • 2.2新增。
  • exception StopIteration
    • 当一个iterator的next()方法走到尽头时触发。派生自Exception,而不是StandardError,因为按程序设计来说,这不是个错误。
    • 2.2新增。
  • exception SyntaxError
    • 当解释器遇到一个语法错误时引发。可能在import语句中,exec语句中,在内置函数调用eval()或input(),在读取初始化脚本或标准输入(可交互)时引发。
    • 类实例拥有属性filename,lineno,offset和text来更容易的访问相关细节。str()仅仅返回实例的信息。
  • exception IndentationError
    • 不正确缩进相关的语法错误基类。SyntaxError的子类。
  • exception TabError
    • 当缩进中包含对tab和空格的混用时引发。IndentationError的子类。
  • exception SystemError
    • 当解释器发现内部错误,但情况并没有看起来那么严重时引发。关联值是一个字符串,它指示具体错误(底层相关)。
    • 应该把这个异常给python解释器的作者。报告使用的解释器版本,确切的错误信息,以及错误发出的程序源码(如果便于提供的话)。
  • exception SystemExit
    • 由sys.exit()引发此异常。如果不处理,python解释器会退出。不会打印栈回溯信息。如果关联值是一般整数,它指定了退出状态码(传给C的exit()函数);如果是None,exit状态为0;如果有一个其他类型(比如string),对象的值会被打印,exit状态码是1。
    • 实例拥有一个·code属性,用于设定推荐的退出码或错误信息(默认为None)。同时,该异常直接继承自BaseException,而不是StandardError,因为这从技术山来说不是个错误。
    • sys.exit()调用会被转义成异常,以便执行清理处理程序(try的finally从句),因此,调试器会执行脚本,不必冒失去控制的风险。如果需要程序绝对立即退出(例如,os.fork()后的子进程中),可以用os._exit()函数。
    • 2.5更改:继承自BaseException。
  • exception TypeError
    • 当操作或应用函数到一个不合适类型的对象上时抛出。关联值是字符串给出不匹配的详情。
  • exception UnboundLocalError
    • 当引用函数或方法的局部变量,但是变量没有绑定值时抛出。NameError的子类。
    • 2.0新增。
  • exception UnicodeError
    • 当Unicode相关的编解码错误时抛出。ValueError的子类。
    • UnicodeError含有描述编解码错误的属性。例如,err.object[err.start:err.end]给出了导致编解码错误的特定无效输入。
    • encoding
      • 引发错误的编码名称
    • reason
      • 编码错误原因
    • object
      • 尝试编解码的对象
    • start
      • 无效数据对象的首索引
    • end
      • 无效数据对象的尾索引
    • 2.0新增。
  • exception UnicodeEncodeError
    • unicode编码相关错误时抛出,UnicodeError的子类。
    • 2.3新增
  • exception UnicodeDecodeError
    • unicode解码相关错误时抛出,UnicodeError的子类。
    • 2.3新增
  • exception UnicodeTranslateError
    • 当翻译过程中出现unicode相关错误时抛出。UnicodeError的子类。
    • 2.3新增
  • exception ValueError
    • 内置操作或函数接收到一个拥有类型正确但不合适的值时抛出,这种情况下不能用诸如IndexError这样的更精确的异常进行引发。
  • exception VMSError
    • 只有VMS可用。当VMS-特定错误发生时抛出。
  • exception WindowsError
    • 当Windows特定错误发生时,或当错误号码不能和errno值对应上时抛出。winerror和strerror值由Windows API函数GetLastError()和FormatMessage()函数返回。errno值映射winerror值到errno.h中对应的值。这是OSError的子类。
    • 2.0新增
    • 2.5中改变:此前放置GetLastError()代码到errno中。
  • exception ZeroDivisionError
    • 触发或模运算中,如果第二个参数时0,则抛出。关联值是一个字符串,指示操作数和操作的类型。

下列异常作为警告使用;参考warnings模块获取更多信息。

  • exception Warning
    • 警告类别的基类。
  • exception UserWarning
    • 用户代码生成的警告基类。
  • exception DeprecationWarning
    • 弃用特性的警告基类
  • exception PendingDeprecationWarning
    • 未来会被弃用的警告基类
  • exception SyntaxWarning
    • 可疑语法的警告基类
  • exception RuntimeWarning
    • 可疑运行时行为的警告基类
  • exception FutureWarning
    • 将来会改变语义结构的警告基类
  • exception ImportWarning
    • 模块导入可能出错的警告基类
    • 2.5新增
  • exception UnicodeWarning
    • Unicode相关的警告基类

异常层级关系

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