📅  最后修改于: 2020-04-08 09:34:29             🧑  作者: Mango
Python中的所有实例必须是从BaseException派生的类的实例。通过子类不相关的两个异常类,即使它们具有相同的名称,也永远不会等效。内置异常可以由解释器或内置函数生成。
错误发生时,Python中会引发一些内置的异常。可以使用local()内置函数来查看这些内置异常,如下所示:
>>> locals()['__ builtins__']
这将返回内置异常,函数和属性的字典。
基类
以下异常通常用作其他异常的基类。
try:
...
except SomeException:
tb = sys.exc_info()[2]
raise OtherException(...).with_traceback(tb)
2, exception Exception
这是所有内置的非系统退出异常的基类。所有用户定义的异常也应从此类派生。
范例
try:
a = 10/0
print a
except ArithmeticError:
print "该语句引发算术异常."
else:
print "成功."
输出:
该语句引发算术异常.
4, exception BufferError
当无法执行与缓冲区相关的操作时,将引发此异常。
范例:
try:
a = [1, 2, 3]
print a[3]
except LookupError:
print "索引越界."
else:
print "成功"
输出:
索引越界.
具体异常
以下异常是通常引发的异常。
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