一、异常处理模式
1. 模式一:
try:
检测范围
except Exception [as reason]:
出现异常(Exception)后的处理
1.1一个try,一个except:
try:
file=open(r'E:\zzz.txt','r')
print(file.read())
file.close()
except OSError as reason: #reason是一个变量,用这个变量可以得知出错的类型
print('文件出错了,文件的错误是:',str(reason))
#运行结果
文件出错了,文件的错误是: [Errno 2] No such file or directory: 'E:\\zzz.txt'
注:举一个处理raise自动引发的异常的例子:
try:
for i in range(4):
for j in range(3,5):
if i==j: #当i==j时使程序终止
raise KeyboardInterrupt
print(i,j)
except KeyboardInterrupt:
print('程序终止!')
#运行结果
0 3
0 4
1 3
1 4
2 3
2 4
程序终止!
1.2 一个try,多个except
try:
sum=1+'2'
file=open(r'E:\zzz.txt','r')
print(file.read())
file.close()
except OSError as reason: #reason是一个变量,用这个变量可以得知出错的类型
print('文件出错了,文件的错误是:',str(reason))
except TypeError as reason:
print('文件的错误类型:',str(reason))
#运行结果
文件的错误类型: unsupported operand type(s) for +: 'int' and 'str'
注:从上面这个例子中可以看出,try语句中存在两个异常,但是程序只处理了第一个异常。所以当try中有多个异常时,程序处理完 第一个异常后,try中的语句就不再往下执行了。
1.3 同时对多个异常进行统一处理
#方式1:这种方式不推荐
try:
sum='1'+2
file=open(r'E:\zxq.txt','r')
print(file.read())
file.close()
except: #这种方式不推荐
print('出错了')
#方式2:
try:
sum=1+'2'
file=open(r'E:\zxq.txt','r')
print(file.read())
file.close()
except (OSError,TypeError):
print('出错了!!')
注:上例中的‘方式1’,except后面如果不带任何异常类,python会捕获所有try语句块中的异常并统一处理,但这种方法并不推荐:因为这样会隐藏所有程序员未想到错误,如果用户输入Ctrl+C试图终止程序,会被解释为KeyboardInterrupt异常,而使程序无法终止。
2.模式二:
try:
检测范围
except Exception[as reason]:
出现异常(Exception)后的处理
finally:
一定会执行的部分
先看下面这个例子:
try:
file=open(r'E:\zxq.txt','w')
file.write('hello World!!')
sum=1+'2' #程序到此出现异常,不再往下执行,如果文件未及时关闭,会导致写入文件中的内容丢失
file.close()
except (OSError,TypeError): #如果try中没有任何错误就会跳过这个语句块
print('程序出现错误!')
finally: #无论如何都会执行finally中的内容
file.close()
注:从上面的例子中可以看出,当程序发生异常时,try语句块中剩下的语句将不再继续执行,会导致文件不能及时关闭。程序意外中断,将会导致写入缓冲区的数据丢失。所以使用finally语句块,可以将未能正常关闭的文件进行关闭,避免上述事情的发生。
但是如果打开的文件不存在,在finally语句块中将不存在的文件进行关闭,程序会引发异常,如下:
try:
file=open(r'E:\zzz.txt','r') #文件不存在,抛出异常
print(file.read())
file.close()
except OSError: #如果try中没有任何错误就会跳过这个语句块
print('程序出现错误!')
finally: #无论如何都会执行finally中的内容
file.close()
#运行结果
程序出现错误!
Traceback (most recent call last):
File "F:/33_p.py", line 8, in <module>
file.close()
NameError: name 'file' is not defined
要解决上述问题,有两种方法:
方法1:判断文件是否存在:
try:
file=open(r'E:\zzz.txt','r') #文件不存在,抛出异常
print(file.read())
file.close()
except OSError:
print('程序出现错误!')
finally:
if 'file'in locals(): #如果文件对象变量存在当前局部变量符号表的话,说明打开成功
file.close()
方法2:用with-open方法打开文件,如下详细解释这个方法。
二、with-open:打开文件
with open('路径名') as file:
文件操作
为了避免忘记及时关闭打开的文件,可使用with-open语句打开文件。即使文件的操作会出现异常,但是当跳出with-open语句块后,文件依然会关闭。
try:
with open(r'E:\zzz.txt','r') as file: #如果使用finally语句来处理异常发生时未能关闭文件,若文件本身就不存在,也会抛出异常
print(file.read())
except OSError as reason:
print('错误:',reason)
#运行结果
错误: [Errno 2] No such file or directory: 'E:\\zzz.txt'
注:在上面这个例子中,我们不必再担心关闭一个不存在的文件而引发异常了!
使用with-open打开文件再也不用担心忘记关闭文件,或者关闭一个不存在的文件而引发错误了!