10.2 Python中的异常
在先前的一些章节里你已经执行了一些代码,你一定遇到了程序“崩溃”或因未解决的错误而终止的情况。你会看到“跟踪记录(traceback)”消息以及随后解释器向你提供的信息,包括错误的名称、原因和发生错误的行号。不管你是通过Python解释器执行还是标准的脚本执行,所有的错误都符合相似的格式,这提供了一个一致的错误接口。所有错误,无论是语意上的还是逻辑上的,都是由于和Python解释器不相容导致的,其后果就是引发异常。
我们来看几个异常的例子。
- NameError:尝试访问一个未申明的变量
NameError表示我们访问了一个没有初始化的变量。在Python解释器的符号表没有找到那个另人讨厌的变量,我们将在后面的两章讨论名称空间,现在大家可以认为它们是连接名字和对象的“地址簿”就可以了。任何可访问的变量必须在名称空间里列出,访问变量需要由解释器进行搜索,如果请求的名字没有在任何名称空间里找到,那么将会生成一个NameError异常。
- ZeroDivisionError:除数为零
我们边的例子使用的是整型,但事实上,任何数值被零除都会导致一个ZeroDivisionError异常。
- SyntaxError: Python解释器语法错误
SyntaxError异常是唯一不是在运行时发生的异常。它代表Python代码中有一个不正确的结构,在它改正之前程序无法执行。这些错误一般都是在编译时发生,Python解释器无法把你的脚本转化为Python字节代码。当然这也可能是你导入一个有缺陷的模块的时候。
- IndexError:请求的索引超出序列范围
IndexError在你尝试使用一个超出范围的值索引序列时引发。
- KeyError:请求一个不存在的字典关键字
映射对象,例如字典,是依靠关键字(key)访问数据值的。如果使用错误的或是不存在的键请求字典就会引发一个KeyError异常。
- IOError:输入/输出错误
类似尝试打开一个不存在的磁盘文件一类的操作会引发一个操作系统输入/输出(I/O)错误。任何类型的I/O错误都会引发IOError异常。
- AttributeError:尝试访问未知的对象属性
在我们的例子中,我们在myInst.bar储存了一个值,也就是实例mylnst的bar属性。属性被定义后,我们可以使用熟悉的点/属性操作符访问它,但如果是没有定义属性,例如我们访问foo属性,将导致一个AttributeError异常。