1.NameError
尝试访问一个未声明的变量,会引发NameError。
例如:
print(foo)
错误信息如下:
Traceback (most recent call last): File “D:/PythonCode/Chapter09/异常.py”, line 1, in print(foo)NameError: name ‘foo’ is not defined
上述信息表明,解释器在任何命名空间里面都没有找到foo。
2.ZeroDivisionError
当除数为零的时候,会引发ZeroDivisionError异常。
例如:1/0错误信息如下:
Traceback (most recent call last): File “D:/PythonCode/Chapter09/异常.py”, line 1, in 1/0ZeroDivisionError: division by zero
事实上,任何数值被零除都会导致上述异常。
3.SyntaxError
当解释器发现语法错误时,会引发SyntaxError异常。
例如:
list = [“a”,“b”,“c”]
for i in list
print(i)在上述示例中,由于for循环的后面缺少冒号,所以导致程序出现如下错误信息:
File “D:/PythonCode/Chapter09/异常.py”, line 2 for i in list ^SyntaxError: invalid syntaxSyntaxError
异常是唯一不在运行时发生的异常,它代表着Python代码中有一个不正确的结构,使得程序无法执行。这些错误一般是在编译时发生,解释器无法把脚本转换为字节代码。
4.IndexError
当使用序列中不存在的索引时,会引发IndexError异常。
例如:
list = []list[0]
上述示例中,list列表中没有任何元素,使用索引0访问列表首位元素时,出现如下错误信息:
Traceback (most recent call last): File “D:/PythonCode/Chapter09/异常.py”, line 2, in list[0]IndexError: list index out of range
上述信息表明,列表的索引值超出了列表的范围。
5.KeyError
当使用映射中不存在的键时,会引发KeyError异常。
例如:
myDict = {‘host’:‘earth’,‘port’:80}myDict[‘server’]
上述示例中,myDict字典中只有host和port两个键,获取server键对应的值时,出现如下错误信息:
Traceback (most recent call last): File “D:/PythonCode/Chapter09/异常.py”, line 2, in myDict[‘server’]KeyError: ‘server’
上述信息表明,出现了字典中没有的键server。
6.FileNotFoundError
试图打开不存在的文件时,会引发FileNotFoundError(Python 3.2以前是IOError)异常。
例如:
f = open(“test”)
上述示例中,使用open方法打开名为test的文件或目录,出现如下错误信息:
Traceback (most recent call last): File “D:/PythonCode/Chapter09/异常.py”, line 1, in f = open(“test”)FileNotFoundError: [Errno 2] No such file or directory: ‘test’
上述信息表明,没有找到名称为test的文件或者目录。
7.AttributeError
当尝试访问未知的对象属性时,会引发AttributeError异常。
例如:
class Car(object):
passcar = Car()car.color = “黑色”
print(car.color)
print(car.name)
上述示例中,Car类没有定义任何属性和方法,在创建Car类的实例以后,动态地给car引用的实例添加了color属性,然后访问它的color和name属性时,出现如下错误信息:
Traceback (most recent call last): File “D:/PythonCode/Chapter09/异常.py”, line 6, in print(car.name)AttributeError: ‘Car’ object has no attribute ‘name’
上述信息表明,在Car的实例中定义了color属性,所以可以使用car.color的方式访问;但是没有定义name属性,所以访问name属性时就会出错。