Skip to content

异常

在运行或编写一个程序时常会遇到错误异常,这时 python 会给一个错误提示类名,告诉出现了什么样的问题。能很好的理解这些错误提示类名所代表的意思,可以帮助你在最快的时间内找到问题所在,从而解决程序上的问题是非常有帮助的。

Python 中的异常

在运行程序的时候,会经常遇到代码崩溃或因未解决的错误而终止的情况。就会看到“跟踪记录(traceback)”消息以及随后解释器提供的错误信息,包括错误的名称、原因和发生错误的行号。所有的错误都符合相似的格式,这提供了一个一致的错误接口。所有错误,无论是语意上的还是逻辑上的,都是由于和 Python 解释器不相容导致的,其后果就是引发异常。

我们来看几个异常的例子。

NameError

尝试访问一个未申明的变量

python
>>> foo
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'foo' is not defined

NameError 表示我们访问了一个没有初始化的变量。在 Python 解释器的符号表没有找到某个变量时,如果变量的名字没有在任何名称空间里找到,那么将会生成一个 NameError 异常。

ZeroDivisionError

除数为零

python
>>> 1/0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero

任何数值被零除都会导致一个 ZeroDivisionError 异常。

SyntaxError

Python 解释器语法错误

python
>>> for
  File "<stdin>", line 1
    for
      ^
SyntaxError: invalid syntax

SyntaxError 异常是唯一不是在运行时发生的异常。它代表 Python 代码中有一个不正确的结构,在它改正之前程序无法执行。这些错误一般都是在编译时发生,Python 解释器无法把你的脚本转化为 Python 字节代码。当然这也可能是你导入一个有缺陷的模块的时候。

IndexError

请求的索引超出序列范围

python
>>> l[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range

IndexError 在你尝试使用一个超出范围的值索引序列时引发。

KeyError

请求一个不存在的字典关键字

python
>>> d = {'host':'127.0.0.1', 'port':80}
>>> d['server']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'server

映射对象,例如字典,是依靠关键字(key)访问数据值的。如果使用错误的或是不存在的键请求字典就会引发一个 KeyError 异常。

IOError

输入/输出错误

python
>>> f = open('test.txt')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory: 'test.txt'

类似尝试打开一个不存在的磁盘文件一类的操作会引发一个操作系统输入/输出(I/O)错误。任何类型的 I/O 错误都会引发IOError异常。

AttributeError

尝试访问未知的对象属性

python
>>> e = Example()
>>> e.bar = 'span'
>>> e.bar
'span'
>>> e.foo
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Example' object has no attribute 'foo'

在我们的例子中,我们在 e.bar 储存了一个值,也就是实例 Examplebar 属性。属性被定义后,可以使用 实例对象.属性 操作符访问它,但如果是没有定义属性,例如我们访问 foo 属性,将导致一个 AttributeError 异常。