Python异常处理讲座
使用python编程的时候难免会出现各种各样的错误,这些错误会使程序中断。python解释器会告诉你错误发生在什么位置以及错误产生的原因,便于我们进行修改和调试。有时候我们并不希望这种错误中断程序的运行,比如在使用爬虫访问网站的时候,我们并不希望因为服务器未响应的问题导致爬虫程序出现异常继而中断,通过异常处理能够忽略本次异常让程序继续运行下去。
异常处理(exception handling)是一种错误处理( error handling)机制。
Python是一种解释型语言,没有编译这个环节,在实际执行代码才执行语法检查,发现语法是否正确。
在程序运行过程中,可能遇到各种各样的错误:
1.有的错误是程序编写有问题造成的,比如本来应该输出整数结果输出了字符串,这种错误我们通常称之为bug,bug是必须修复的。
2.有的错误是用户输入造成的,比如让用户输入email地址,结果得到一个空字符串,这种错误可以通过检查用户输入来做相应的处理。
3.还有一类错误是完全无法在程序运行过程中预测的,比如写入文件的时候,磁盘满了,写不进去了,或者从网络抓取数据,网络突然断掉了。这类错误也称为异常,在程序中通常是必须处理的,否则,程序会因为各种问题终止并退出。
Python内置了一套异常处理机制,来帮助我们进行异常处理。异常处理一般语法格式:
try:
try语句块
except [<ERRORTYPE> [ Alias]]:
except语句块
else:
else语句块
finally:
finally语句块
上述异常语句的各子句的执行流程,参见下图:
其中,ERRORTYPE是要监视的错误类型,常见的Python语言异常错误类型如下:
AttributeError:属性错误,特性引用和赋值失败时会引发属性错误
NameError:试图访问的变量名不存在
SyntaxError:语法错误,代码形式错误
Exception:所有异常的基类,因为所有python异常类都是基类Exception的其中一员,异常都是从基类Exception继承的,并且都在exceptions python 模块中定义。
IOError:一般常见于打开不存在文件时会引发IOError错误,也可以解理为输出输入错误。
KeyError:使用了映射中不存在的关键字(键)时引发的关键字错误。
IndexError:索引错误,使用的索引不存在,常索引超出序列范围。
TypeError:类型错误,内建操作或是函数应于在了错误类型的对象时会引发类型错误
ZeroDivisonError:除数为0,在用除法操作时,第二个参数为0时引发了该错误
ValueError:值错误,传给对象的参数类型不正确,像是给int()函数传入了字符串数据类型的参数。
下面进行解读
try-except语法格式
try:
语句块1
except <ERRORTYPE>:
语句块2
说明
这是最简单版的语法。
其中try- except关键字;ERRORTYPE是要监视的错误类型。
当我们认为某些代码(这里是语句块1)可能会出错时,就可以用try来运行这段代码(这里是语句块1),如果执行出错,则后续代码不会继续执行,而是跳转至错误处理代码,即except处执行,如果抛出的错误正好是except所监视的错误类型,就会执行语句块2,再执行完句块2后的代码。
try-except示例代码如下:
while True:
x=input("请输入一个数(输入a终止):")
if x == "a" :
print("终止")
break
try:
result = 5/float(x)
print("result is",result)
except ZeroDivisionError:
print("零不能做除数!")
print("--------------")
运行之,参见下图:
try-except-else语法格式
try:
语句块1
except <ERRORTYPE>:
语句块2
else:
语句块3
try-except-else示例代码如下:
while True:
x=input("请输入一个数(输入a终止):")
if x == "a" :
print("终止")
break
try:
result = 5/float(x)
print("result is",result)
except ZeroDivisionError:
print("零不能做除数!")
else:
print("Re-result is",result)
print("--------------")
运行之,参见下图:
try-except- finally语法格式:
try:
语句块1
except <ERRORTYPE>:
语句块2
finally:
语句块3
说明
执行try中的语句块1:
如果没有异常发生,则在执行finally之后程序退出
如果放生异常,并被except捕获,则执行except的语句块2,之后执行finally的语句块3,然后程序继续运行下去。
特别提示,如果存在finally子句,finally子句将作为try语句完成之前的最后一个任务执行。不管try语句是否产生异常,finally子句都会运行。
try-except- finally示例代码如下:
while True:
x=input("请输入一个数(输入a终止):")
if x == "a" :
print("终止")
break
try:
result = 5/float(x)
print("result is",result)
except ZeroDivisionError:
print("零不能做除数!")
finally:
print("进入 finally")
print("--------------")
运行之,参见下图:
try-except-else-finally语法格式
try:
语句块1
except <ERRORTYPE>:
语句块2
else:
语句块3
finally:
语句块4
try-except-else-finally示例代码如下:
while True:
x=input("请输入一个数(输入a终止):")
if x == "a" :
print("终止")
break
try:
result = 5/float(x)
print("result is",result)
except ZeroDivisionError:
print("零不能做除数!")
else:
print("Re-result is",result)
finally:
print("进入 finally")
print("--------------")
运行之,参见下图:
补充说明:
不管try语句是否产生异常,finally子句都会运行。当try语句的任何其他子句通过break、continue或return语句离开时,finally子句也被执行。
finally子句是可选的;如果要出现finally;如果异常没有被except子句捕获,或者异常发生在except或else子句内,finally子句执行完毕后,会将此异常抛出。
except语句后面如果不指定异常类型,则默认捕获所有异常。
except语句可以有多个,Python会按except语句的顺序依次匹配你指定的异常,如果异常已经处理就不会再进入后面的except语句。
一个except子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组,例如:except (RuntimeError, TypeError, NameError):
else子句是可选的;如果要出现else子句,必须在所有except子句之后。
还可以使用raise或assert可以主动生成异常情况。其中raise可以直接抛出某个异常,assert需要通过布尔值来判断,然后再抛出给定的错误。