📜  Python中的内置异常

📅  最后修改于: 2020-04-08 09:34:29             🧑  作者: Mango

Python中的所有实例必须是从BaseException派生的类的实例。通过子类不相关的两个异常类,即使它们具有相同的名称,也永远不会等效。内置异常可以由解释器或内置函数生成。
错误发生时,Python中会引发一些内置的异常。可以使用local()内置函数来查看这些内置异常,如下所示:

>>> locals()['__ builtins__']

这将返回内置异常,函数和属性的字典。

基类

以下异常通常用作其他异常的基类。

  1. exception BaseException
    这是所有内置异常的基类。它并不意味着被用户定义的类直接继承。对于用户定义的类,使用Exception。此类负责使用传递的参数使用str()创建异常的字符串表示形式。如果没有参数,则返回一个空字符串。
    • args: args是提供给异常构造函数的参数的元组。
    • with_traceback(tb):此方法通常用于异常处理中。此方法将tb设置为该异常的新回溯并返回异常对象。代码:
      try:
          ...
      except SomeException:
          tb = sys.exc_info()[2]
          raise OtherException(...).with_traceback(tb)

      2, exception Exception
      这是所有内置的非系统退出异常的基类。所有用户定义的异常也应从此类派生。

    • 3, exception ArithmeticError
      此类是针对各种算术错误引发的那些内置异常的基类,例如:
      • OverflowError
      • ZeroDivisionError
      • FloatingPointError

      范例

      try:
          a = 10/0
          print a
      except ArithmeticError:
              print "该语句引发算术异常."
      else:
          print "成功."

      输出:

      该语句引发算术异常.

      4, exception BufferError
      当无法执行与缓冲区相关的操作时,将引发此异常。

    • 5,exception LookupError
      这是在映射或序列上使用的键或索引无效或找不到时引发的那些异常的基类。引发的异常是:
      • KeyError
      • IndexError

      范例: 

      try:
          a = [1, 2, 3]
          print a[3]
      except LookupError:
          print "索引越界."
      else:
          print "成功"
      输出:
      索引越界.

      具体异常

      以下异常是通常引发的异常。

      1. exception AssertionError
        当断言assert语句失败时,引发AssertionError。范例:
        assert False, '断言assert语句失败'

        输出:

        Traceback (most recent call last):
          File "exceptions_AssertionError.py", line 12, in
            assert False, '断言assert语句失败'
        AssertionError: The assertion failed

        2, exception AttributeError
        当属性引用或分配失败(例如,引用了不存在的属性)时,引发AttributeError。
        范例:

        class Attributes(object):
            pass
        object = Attributes()
        print object.attribute

        输出:

        Traceback (most recent call last):
          File "d912bae549a2b42953bc62da114ae7a7.py", line 5, in
            print object.attribute
        AttributeError: 'Attributes' object has no attribute 'attribute'

        3, exception EOFError
        当类似input()的内置函数遇到文件结尾条件(EOF)而没有读取任何数据时,引发 EOFError。像readline()这样的文件方法在到达EOF时会返回一个空字符串。
        范例: 

        while True:
            data = raw_input('输入名字 : ')
            print '你好  ', data

        输出: 

        输入名字 :你好 Aditi
        Enter Name :Traceback (most recent call last):
          File "exceptions_EOFError.py", line 13, in
            data = raw_input('Enter name :')
        EOFError: EOF when reading a line

         4,exception FloatingPointError
        浮点操作失败时引发FloatingPointError。总是定义此异常,但是只有在使用–with-fpectl选项配置或在pyconfig.h文件中定义了WANT_SIGFPE_HANDLER符号时,才会引发此异常。

        范例

        import math
        print math.exp(1000)

        输出:

        Traceback (most recent call last):
          File "", line 1, in
        FloatingPointError: in math_1

        5,exception GeneratorExit
        该异常直接继承自BaseException,而不是Exception,因为从技术上讲,它不是错误。关闭生成器或协程时,将引发GeneratorExit异常。
        范例:

        def my_generator():
            try:
                for i in range(5):
                    print '导致', i
                    yield i
            except GeneratorExit:
                print '提前退出'
        g = my_generator()
        print g.next()
        g.close()

        输出:

        导致 0
        提前退出

        6,exception ImportError
        当import语句无法加载模块或from…import中的“ from list”具有无法找到的名称时,将引发ImportError。
        范例:

        import module_does_not_exist

        输出:

        Traceback (most recent call last):
          File "exceptions_ImportError_nomodule.py", line 12, in
            import module_does_not_exist
        ImportError: No module named module_does_not_exist

        范例:

        from exceptions import Userexception

        输出:

        Traceback (most recent call last):
          File "exceptions_ImportError_missingname.py", line 12, in
            from exceptions import Userexception
        ImportError: cannot import name Userexception

        7, exception ModuleNotFoundError
        这是ImportError的子类,当找不到模块时,import会引发该子类。在sys.modules中找不到None时,也会引发此错误。

        8, exception IndexError
        当引用的序列超出范围时,引发IndexError。范例: 

        array = [ 0, 1, 2 ]
        print array[3]

        输出: 

        Traceback (most recent call last):
          File "exceptions_IndexError.py", line 13, in
            print array[3]
        IndexError: list index out of range

        9,exception KeyError
        当在一组现有键中找不到映射键时,引发KeyError。

        范例:

        array = { 'a':1, 'b':2 }
        print array['c']

        输出:

        Traceback (most recent call last):
          File "exceptions_KeyError.py", line 13, in
            print array['c']
        KeyError: 'c'

        10,exception KeyboardInterrupt
        当用户按下中断键(例如Control-C或Delete)时,将引发此错误。

        范例: 

        try:
            print 'Press Return or Ctrl-C:',
            ignored = raw_input()
        except Exception, err:
            print '抓到异常:', err
        except KeyboardInterrupt, err:
            print '抓到KeyboardInterrupt'
        else:
            print '没有异常'

        输出: 

        Press Return or Ctrl-C: ^C抓到 KeyboardInterrupt

         11,exception MemoryError
        当操作内存不足时,将引发此错误。

        范例:

        def fact(a):
            factors = []
            for i in range(1, a+1):
                if a%i == 0:
                    factors.append(i)
            return factors
        num = 600851475143
        print fact(num)

        输出:

        Traceback (most recent call last):
          File "4af5c316c749aff128df20714536b8f3.py", line 9, in
            print fact(num)
          File "4af5c316c749aff128df20714536b8f3.py", line 3, in fact
            for i in range(1, a+1):
        MemoryError

        12,exception NameError
        如果找不到本地或全局名称,则会引发此错误。例如,不合格的变量名。
        范例: 

        def func():
            print ans
        func()

        输出: 

        Traceback (most recent call last):
          File "cfba0a5196b05397e0a23b1b5b8c7e19.py", line 4, in
            func()
          File "cfba0a5196b05397e0a23b1b5b8c7e19.py", line 2, in func
            print ans
        NameError: global name 'ans' is not defined

         13,Exception NotImplementedError
        此异常派生自RuntimeError。当派生类重写该方法时,用户定义的类中的抽象方法应引发此异常。

        范例: 

        class BaseClass(object):
            """定义接口"""
            def __init__(self):
                super(BaseClass, self).__init__()
            def do_something(self):
                """接口没有实现"""
                raise NotImplementedError(self.__class__.__name__ + '.do_something')
        class SubClass(BaseClass):
            """实现接口"""
            def do_something(self):
                """处理"""
                print self.__class__.__name__ + ' doing something!'
        SubClass().do_something()
        BaseClass().do_something()

        输出: 

        Traceback (most recent call last):
          File "b32fc445850cbc23cd2f081ba1c1d60b.py", line 16, in
            BaseClass().do_something()
          File "b32fc445850cbc23cd2f081ba1c1d60b.py", line 7, in do_something
            raise NotImplementedError(self.__class__.__name__ + '.do_something')
        NotImplementedError: BaseClass.do_something

        14, exception OSError([arg])
        当系统函数返回与系统相关的错误,包括I / O故障(例如“找不到文件”或“磁盘已满”错误)时,将引发OSError异常。

        范例: 

        def func():
            print ans
        func()

        输出: 

        Traceback (most recent call last):
          File "442eccd7535a2704adbe372cb731fc0f.py", line 4, in
            print i, os.ttyname(i)
        OSError: [Errno 25] Inappropriate ioctl for device

         15,exception OverflowError
        当算术运算的结果超出范围时,将引发OverflowError。整数引发MemoryError而不是OverflowError。对于超出所需范围的整数,有时会引发OverflowError。由于缺乏C语言中浮点异常处理的标准化,因此未检查浮点操作。

        范例:

        import sys
        print '常规整数: (maxint=%s)' % sys.maxint
        try:
            i = sys.maxint * 3
            print 'No overflow for ', type(i), 'i =', i
        except OverflowError, err:
            print 'Overflowed at ', i, err
        print
        print 'Long integer:'
        for i in range(0, 100, 10):
            print '%2d' % i, 2L ** i
        print
        print 'Floating point values:'
        try:
            f = 2.0**i
            for i in range(100):
                print i, f
                f = f ** 2
        except OverflowError, err:
            print 'Overflowed after ', f, err

        输出:

        常规整数: (maxint=9223372036854775807)
        No overflow for   i = 27670116110564327421
        Long integer:
         0 1
        10 1024
        20 1048576
        30 1073741824
        40 1099511627776
        50 1125899906842624
        60 1152921504606846976
        70 1180591620717411303424
        80 1208925819614629174706176
        90 1237940039285380274899124224
        Floating point values:
        0 1.23794003929e+27
        1 1.53249554087e+54
        2 2.34854258277e+108
        3 5.5156522631e+216
        Overflowed after  5.5156522631e+216 (34, 'Numerical result out of range')

        16,exception RecursionError
        RecursionError源自RuntimeError。当解释器检测到超过最大递归深度时,将引发此异常。

        17,exception ReferenceError
        当在垃圾回收之后使用弱引用代理访问引用对象的属性时,引发ReferenceError。

        范例:

        import gc
        import weakref
        class Foo(object):
            def __init__(self, name):
                self.name = name
            def __del__(self):
                print '(Deleting %s)' % self
        obj = Foo('obj')
        p = weakref.proxy(obj)
        print 'BEFORE:', p.name
        obj = None
        print 'AFTER:', p.name

        输出:

        BEFORE: obj
        (Deleting )
        AFTER:
        Traceback (most recent call last):
          File "49d0c29d8fe607b862c02f4e1cb6c756.py", line 17, in
            print 'AFTER:', p.name
        ReferenceError: weakly-referenced object no longer exists

        18, exception RuntimeError
        当没有其他异常适用时,将引发RuntimeError。它返回一个字符串,指示出确切的错误。

        19,  exception StopIteration
        内置函数next()和迭代器的__next __()方法引发StopIteration错误,以表示所有项目都是由迭代器产生的。范例: 

        Arr = [3, 1, 2]
        i=iter(Arr)
        print i
        print i.next()
        print i.next()
        print i.next()
        print i.next()

        输出: 

        3
        1
        2
        Traceback (most recent call last):
          File "2136fa9a620e14f8436bb60d5395cc5b.py", line 8, in
            print i.next()
        StopIteration

         20,exception SyntaxError
        当解析器遇到语法错误时,引发SyntaxError。在import语句中或在调用内置函数exec()或eval()时,或在读取初始脚本或标准输入时,可能会发生语法错误。

        范例:

        try:
            print eval('芒果 for 芒果')
        except SyntaxError, err:
            print 'Syntax error %s (%s-%s): %s' % \
                (err.filename, err.lineno, err.offset, err.text)
            print err

        输出:

        Syntax error  (1-9): 芒果 for 芒果
        invalid syntax (, line 1)

        21, exception SystemError
        当解释器发现内部错误时,将引发SystemError。关联的值是一个字符串,指出出了什么问题。

        22,exception SystemExit
        调用sys.exit()函数时,将引发SystemExit。调用sys.exit()会转换为异常,以执行清理处理程序(try语句的最终子句)并调试脚本,而不会冒失去控制权的风险。

        23,exception TypeError
        当将操作或函数应用于不适当类型的对象时,引发 TypeError。此异常返回一个字符串,其中提供有关类型不匹配的详细信息。范例: 

        arr = ('tuple', ) + 'string'
        print arr

        输出: 

        Traceback (most recent call last):
          File "30238c120c0868eba7e13a06c0b1b1e4.py", line 1, in
            arr = ('tuple', ) + 'string'
        TypeError: can only concatenate tuple (not "str") to tuple

        24, exception UnboundLocalError
        UnboundLocalError是NameError的子类,当在函数或方法中对局部变量进行引用但未为该变量赋值时会引发该异常。

        范例: 

        def global_name_error():
            print unknown_global_name
        def unbound_local():
            local_val = local_val + 1
            print local_val
        try:
            global_name_error()
        except NameError, err:
            print '全局name错误:', err
        try:
            unbound_local()
        except UnboundLocalError, err:
            print '局部name错误:', err

        输出: 

        全局name错误: global name 'unknown_global_name' is not defined
        局部name错误: local variable 'local_val' referenced before assignment

        25, exception UnicodeError
        此异常是ValueError的子类。当发生与Unicode相关的编码或解码错误时,会引发UnicodeError。

        26,exception ValueError
        当内置操作或函数接收到具有正确类型但值无效的参数时,引发ValueError。范例: 

        print int('a')

         输出: 

        Traceback (most recent call last):
          File "44f00efda935715a3c5468d899080381.py", line 1, in
            print int('a')
        ValueError: invalid literal for int() with base 10: 'a'

         27, exception ZeroDivisionError
        当除法或模运算的第二个参数为零时,将引发ZeroDivisionError。此异常返回一个字符串,指示操作数和操作的类型。

        范例:

        print 1/0

        输出:

        Traceback (most recent call last):
          File "c31d9626b41e53d170a78eac7d98cb85.py", line 1, in
            print 1/0
        ZeroDivisionError: integer division or modulo by zero