1 异常简介
看如下示例:
print("-------test begin--------")
f = open("123.txt", "r") #用只读模式打开一个不存在的文件,会报错
f.close()
print("-------test over--------")
打开一个不存在的文件123.txt,当找不到123.txt 文件时,就会抛出给我们一个IOError类型的错 误,No such file or directory:123.txt (没有123.txt这样的文件或目录)
异常: 当Python检测到一个错误时,解释器就无法继续执行了,反而出现了一些错误的提示,这就是所 谓的"异常"
2 捕获异常 try...except...
try:
print("-------test begin--------")
f = open("123.txt","r")
f.close()
print("-------test over--------")
except IOError: #文件没找到属于IO异常,输入输出异常
pass #捕获异常后,执行的代码
➢此程序看不到任何错误,因为用except 捕获到了IOError异常,并添加了处理的方法
➢pass 表示实现了相应的实现,但什么也不做;如果把pass改为print语句,那么就会输出其他信息
➢把可能出现问题的代码,放在try中
➢把处理异常的代码,放在except中
3 except捕获多个异常
try:
print(num)
f = open("123.txt", "r")
except (NameError,IOError): #将可能产生的所有异常类型,都放在下面的小括号中
print("产生错误了......") #捕获异常后,执行的代码
当捕获多个异常时,可以把要捕获的异常的名字,放到except 后,并使用元组的方式仅进行存储。
4 获取异常的信息描述
try:
f = open("test.txt", "r")
print(num)
except (NameError,IOError) as result: #将可能产生的所有异常类型,都放在下面的小括号中
print("产生错误了......") #捕获异常后,执行的代码
print(result) #打印错误信息
当捕获多个异常时,可以把要捕获的异常的名字,放到except 后,并使用元组的方式仅进行存储。但是只对第一个异常报错。
5 捕获所有异常
try:
f = open("123.txt", "r")
print(num)
except Exception as result: #Exception表示可以承接所有异常类型,
print("产生错误了......") #捕获异常后,执行的代码
print(result) #打印错误信息
6 try...finally...
try...finally...语句用来表达这样的情况:
在程序中,如果一个段代码必须要执行,即无论异常是否产生都要执行,那么此时就需要使用 finally。 比如文件关闭,释放锁,把数据库连接返还给连接池等。
import time
try:
f = open("test.txt","r")
try:
while True:
context = f.readline()
if len(context)==0:
break
time.sleep(2)
print(context)
finally: #一定会被执行
f.close()
print("文件关闭")
except Exception as result:
print("发生异常:%s"%result)
test.txt文件中每一行数据打印,但是我有意在每打印一行之前用time.sleep方法暂停2秒钟。这样 做的原因是让程序运行得慢一些。在程序运行的时候,按Ctrl+c中断(取消)程序。
我们可以观察到KeyboardInterrupt异常被触发,程序退出。但是在程序退出之前,finally从句仍 然被执行,把文件关闭。