Python中的内置异常
Python中的所有实例都必须是派生自BaseException的类的实例。通过子类化不相关的两个异常类永远不会等价,即使它们具有相同的名称。内置异常可以由解释器或内置函数生成。
Python中有几个内置异常会在发生错误时引发。可以使用local()内置函数查看这些内置异常,如下所示:
>>> locals()['__builtins__']
这将返回一个内置异常、函数和属性的字典。
基类
以下异常主要用作其他异常的基类。
- 异常 BaseException
这是所有内置异常的基类。它并不意味着由用户定义的类直接继承。对于用户定义的类,使用了异常。此类负责使用传递的参数使用 str() 创建异常的字符串表示形式。如果没有参数,则返回一个空字符串。- args : args 是给异常构造函数的参数元组。
- with_traceback(tb) :此方法通常用于异常处理。此方法将 tb 设置为异常的新回溯并返回异常对象。
代码 :
try: ... except SomeException: tb = sys.exc_info()[2] raise OtherException(...).with_traceback(tb)
- 异常异常
这是所有内置的非系统退出异常的基类。所有用户定义的异常也应该从这个类派生。 - 算术错误异常
此类是为各种算术错误引发的那些内置异常的基类,例如:- 溢出错误
- 零除法错误
- 浮点错误
例子 :
try: a = 10/0 print (a) except ArithmeticError: print ("This statement is raising an arithmetic exception.") else: print ("Success.")
输出 :
This statement is raising an arithmetic exception.
- 异常缓冲区错误
当无法执行缓冲区相关操作时会引发此异常。 - 异常查找错误
这是在映射或序列上使用的键或索引无效或找不到时引发的那些异常的基类。提出的例外是:- 键错误
- 索引错误
例子 :
try: a = [1, 2, 3] print (a[3]) except LookupError: print ("Index out of bound error.") else: print ("Success")
输出 :
Index out of bound error.
具体例外
以下异常是通常引发的异常。
- 异常断言错误
当断言语句失败时会引发 AssertionError。例子 :
assert False, 'The assertion failed'
输出 :
Traceback (most recent call last): File "exceptions_AssertionError.py", line 12, in assert False, 'The assertion failed' AssertionError: The assertion failed
- 异常属性错误
当属性引用或赋值失败时引发 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'
- 异常 EOFError
当像 input() 这样的内置函数在没有读取任何数据的情况下遇到文件结束条件 (EOF) 时,会引发 EOFError。像 readline() 这样的文件方法在遇到 EOF 时会返回一个空字符串。例子 :
while True: data = input('Enter name : ') print ('Hello ', data)
输出 :
Enter Name :Hello 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
- 异常浮点错误
当浮点操作失败时会引发 FloatingPointError。这个异常总是被定义的,但只能在Python配置了 --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
- 异常生成器退出
此异常直接继承自 BaseException 而不是 Exception,因为它在技术上不是错误。当生成器或协程关闭时会引发 GeneratorExit 异常。例子 :
def my_generator(): try: for i in range(5): print ('Yielding', i) yield i except GeneratorExit: print ('Exiting early') g = my_generator() print (g.next()) g.close()
输出 :
Yielding 0 0 Exiting early
- 异常导入错误
当 import 语句无法加载模块或 from ... import 中的“来自列表”的名称无法找到时,会引发 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
- 异常 ModuleNotFoundError
这是 ImportError 的子类,当找不到模块时由 import 引发。在 sys.modules 中找到 None 时也会引发它。 - 异常索引错误
当引用超出范围的序列时会引发 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
- 异常键错误
当在现有键集中找不到映射键时,会引发 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'
- 键盘中断异常
当用户按下 Control-C 或 Delete 等中断键时会引发此错误。例子 :
try: print ('Press Return or Ctrl-C:',) ignored = input() except Exception, err: print ('Caught exception:', err) except KeyboardInterrupt, err: print ('Caught KeyboardInterrupt') else: print ('No exception')
输出 :
Press Return or Ctrl-C: ^CCaught KeyboardInterrupt
- 异常内存错误
当操作内存不足时会引发此错误。例子 :
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
- 异常名称错误
找不到本地或全局名称时会引发此错误。例如,不合格的变量名。例子 :
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
- 异常 NotImplementedError
此异常源自 RuntimeError。当派生类重写方法时,用户定义类中的抽象方法应引发此异常。例子 :
class BaseClass(object): """Defines the interface""" def __init__(self): super(BaseClass, self).__init__() def do_something(self): """The interface, not implemented""" raise NotImplementedError(self.__class__.__name__ + '.do_something') class SubClass(BaseClass): """Implements the interface""" def do_something(self): """really does something""" 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
- 异常 OSError([arg])
当系统函数返回与系统相关的错误时会引发 OSError 异常,包括 I/O 失败,例如“找不到文件”或“磁盘已满”错误。例子 :
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
- 异常溢出错误
当算术运算的结果超出范围时引发溢出错误。整数引发 MemoryError 而不是 OverflowError。有时会为超出所需范围的整数引发溢出错误。由于 C 中浮点异常处理缺乏标准化,因此不检查浮点操作。例子 :
import sys print ('Regular integer: (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)
输出 :
Regular integer: (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')
- 异常递归错误
RecursionError 派生自 RuntimeError。当解释器检测到超出最大递归深度时会引发此异常。 - 异常参考错误
当在垃圾回收之后使用弱引用代理访问引用对象的属性时,会引发 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
- 异常运行时错误
当没有其他异常适用时引发 RuntimeError。它返回一个字符串,指示究竟出了什么问题。 - 异常停止迭代
StopIteration 错误由内置函数next() 和迭代器的 __next__() 方法引发,以表明所有项目均由迭代器生成。例子 :
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
- 异常语法错误
当解析器遇到语法错误时会引发 SyntaxError。语法错误可能发生在 import 语句或调用内置函数 exec() 或 eval() 时,或者在读取初始脚本或标准输入时。例子 :
try: print (eval('geeks for geeks')) except SyntaxError, err: print ('Syntax error %s (%s-%s): %s' % \ (err.filename, err.lineno, err.offset, err.text)) print (err)
输出 :
Syntax error (1-9): geeks for geeks invalid syntax (, line 1)
- 异常系统错误
当解释器发现内部错误时引发 SystemError。关联的值是一个字符串,指示出了什么问题。 - 异常系统退出
调用 sys.exit()函数时会引发 SystemExit。对 sys.exit() 的调用被转换为执行清理处理程序(最后是 try 语句的子句)和调试脚本的异常,而不会冒失去控制的风险。 - 异常类型错误
当操作或函数应用于不适当类型的对象时,会引发 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
- 异常 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 ('Global name error:', err) try: unbound_local() except UnboundLocalError, err: print ('Local name error:', err)
输出 :
Global name error: global name 'unknown_global_name' is not defined Local name error: local variable 'local_val' referenced before assignment
- 异常 UnicodeError
此异常是 ValueError 的子类。发生与 Unicode 相关的编码或解码错误时会引发 UnicodeError。 - 异常值错误
当内置操作或函数接收到具有正确类型但值无效的参数时,会引发 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'
- 异常 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