简介
使用python编程的时候难免会出现各种各样的错误,这些错误会使程序中断。好在python解释器会告诉你错误发生在什么位置以及错误产生的原因,便于我们进行修改和调试。有时候我们并不希望这种错误中断程序的运行,比如在使用爬虫访问网站的时候,我们并不希望因为服务器未响应的问题导致爬虫程序出现异常继而中断。于是通过异常处理能够忽略本次异常让程序继续运行下去。
语法错误
异常是指在程序运行的时候引发的错误,而语法错误是指在程序编写的时候就存在,语法错误一般用SyntaxError表示,比如:
>>>print 'a'
File "", line 1
print 'a'
^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print('a')?
1
2
3
4
5
>>>print'a'
File"",line1
print'a'
^
SyntaxError:Missingparenthesesincallto'print'.Didyoumeanprint('a')?
这个就是典型的语法错误,print函数缺少()导致的。
异常
所谓异常,就是程序运行的时候检测到的错误。举个例子:
>>>a = 1
>>>b = 'hello'
>>>a + b
Traceback (most recent call last):
File "", line 1, in
a + b
TypeError: unsupported operand type(s) for +: 'int' and 'str'
1
2
3
4
5
6
7
>>>a=1
>>>b='hello'
>>>a+b
Traceback(mostrecentcalllast):
File"",line1,in
a+b
TypeError:unsupportedoperandtype(s)for+:'int'and'str'
可以看出,将整数和字符串相加的时候会引发一个TypeError异常,这种异常直接将程序中断。在python中还有其他类型的异常,读者可以参考python文档进行了解。
抛出异常
我们可以通过raise关键字在程序的某个位置人为抛出一个异常。这种由我们主动引发异常的行为称为异常的抛出。抛出一个异常的格式如下:
raise 异常类型(提示信息)
1
raise异常类型(提示信息)
这里的异常类型最好跟发生错误的类型一致,当然如果不确定是哪种异常类型,也可以使用通用异常类型Exception表示。比如:
for i in range(10):
if i == 5:
raise Exception("当i等于5时抛出这个通用异常")
print(i)
1
2
3
4
foriinrange(10):
ifi==5:
raiseException("当i等于5时抛出这个通用异常")
print(i)
运行结果为:
0
1
2
3
4
Traceback (most recent call last):
File "", line 3, in
raise Exception("当i等于5时抛出这个通用异常")
Exception: 当i等于5时抛出这个通用异常
1
2
3
4
5
6
7
8
9
0
1
2
3
4
Traceback(mostrecentcalllast):
File"",line3,in
raiseException("当i等于5时抛出这个通用异常")
Exception:当i等于5时抛出这个通用异常
在上面的代码中,我们依次打印i值,当i == 5的时候,抛出一个通用异常Exception,并给出提示信息当i等于5时抛出这个通用异常。关于异常的抛出,我们只要掌握raise语句就可以了。
异常处理
Python程序在遇到异常的时候,如果不进行异常处理,那么程序就会结束运行。在多数情况下我们都希望程序能够打印出该异常并且继续运行程序,因此使用异常处理就显得十分重要了。异常处理使用try-except语句进行处理,它的格式如下:
try:
程序部分
except 异常类型 as 别名:
异常处理部分
1
2
3
4
try:
程序部分
except异常类型as别名:
异常处理部分
上面的语句其实和if-else语句非常相似,都属于分支型语句。程序首先会执行try的代码块,这部分代码也是程序的主体代码,而当主体代码产生异常时,就会执行except语句的代码,打印出异常的类型和提示信息。例如:
a = [1, 2, 'a', 5]
for i in a:
try:
print(a + 1)
except TypeError as tp:
print('类型不同,不能相加')
1
2
3
4
5
6
a=[1,2,'a',5]
foriina:
try:
print(a+1)
exceptTypeErrorastp:
print('类型不同,不能相加')
程序运行结果为:
2
3
类型不同,不能相加
6
1
2
3
4
2
3
类型不同,不能相加
6
从上面的程序可以看出,当我们将列表a中的每个元素都加一的时候,即使遇到了不同类型的数据相加也不会引发程序中断。在异常处会打印出提示信息,保证程序的完整运行。
多个异常处理
当然一个程序可能会产生多个异常,此时就可以使用多个except语句来处理。格式如下:
try:
程序部分
except 异常类型1 as 别名1:
异常处理部分1
except 异常类型2 as 别名2:
异常处理部分2
except 异常类型3 as 别名3:
异常处理部分3
1
2
3
4
5
6
7
8
try:
程序部分
except异常类型1as别名1:
异常处理部分1
except异常类型2as别名2:
异常处理部分2
except异常类型3as别名3:
异常处理部分3
在上面的程序中,首先会执行try语句下面的程序部分,如果发现异常,就会执行第一个except语句查看是不是该异常类型,如果是则执行该异常类型下的语句,如果不是则继续查看下一个except语句,依次进行下去。比如:
a = 1
b = 'finthon'
try:
print(a + b)
except StopIteration as si:
print('停止迭代异常')
except TypeError as te: #将TypeError改成通用异常Exception结果一样
print('类型异常')
1
2
3
4
5
6
7
8
a=1
b='finthon'
try:
print(a+b)
exceptStopIterationassi:
print('停止迭代异常')
exceptTypeErroraste:#将TypeError改成通用异常Exception结果一样
print('类型异常')
程序运行结果为:
类型异常
1
类型异常
我们在这里定义两种异常,StopIteration和TypeError。可以看出这个异常属于类型异常,因而执行了TypeError异常的语句。需要注意的是,如果你并不知道异常类型,可以使用通用异常Exception处理。
迭代器中的异常处理
前面我们介绍了迭代器,当迭代器中的元素全部取出来的时候会引发一个停止迭代的异常StopIteration,这个异常会中断我们的程序,非常不友好。因此在这里我们就需要使用异常处理规避掉这个异常,让程序继续运行下去。比如:
a = iter('finthon')
list1 = []
try:
while True:
list1.append(next(a))
except StopIteration as si:
print(list1)
print('迭代完成')
1
2
3
4
5
6
7
8
a=iter('finthon')
list1=[]
try:
whileTrue:
list1.append(next(a))
exceptStopIterationassi:
print(list1)
print('迭代完成')
程序运行结果为:
['f', 'i', 'n', 't', 'h', 'o', 'n']
迭代完成
1
2
['f','i','n','t','h','o','n']
迭代完成
通过异常处理我们保持了程序的运行并将迭代器产生的数据运用到后面的程序中。
总结
本文介绍了python程序中经常碰到的错误,包括语法错误和异常;然后我们简单地介绍了异常的抛出;通过异常处理来保证我们程序的运行,当你不知道异常类型的时候可以使用通用异常类型Exception处理;在最后以一个迭代器的例子讲解异常处理的实际应用,相信学习完这篇文章会使大家对程序异常处理更加得心应手。