026 Python笔记--异常处理

一、异常处理模式

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打开文件再也不用担心忘记关闭文件,或者关闭一个不存在的文件而引发错误了!

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值