零基础入门学习Python(31)-异常处理2-try语句

try-except语句

try:
检测范围
except Exception[as reason]:
出现异常后的处理代码

报错示例

f = open('我为什么是一个文件.txt')#当该文件不存在时,这个代码就会有异常
print(f.read())
f.close()

在这里插入图片描述

try-except解决

try:
    f = open('我为什么是一个文件.txt')#当该文件不存在时,这个代码就会有异常
    print(f.read())
    f.close()
except OSError:
    print('文件出错啦')

在这里插入图片描述
如何展现报错的具体内容呢?用as reasons

try:
    f = open('我为什么是一个文件.txt')#当该文件不存在时,这个代码就会有异常
    print(f.read())
    f.close()
except OSError as reason:
    print('文件出错啦\n错误的原因是:' + str(reason))

在这里插入图片描述

针对不同异常设置多个except
try:
    sum = 1 + '1'
    f = open('我为什么是一个文件.txt')#当该文件不存在时,这个代码就会有异常
    print(f.read())
    f.close()
except OSError as reason:
    print('文件出错啦\n错误的原因是:' + str(reason))
except TypeError as reason:
    print('类型出错啦\n错误的原因是:' + str(reason))

在这里插入图片描述
在这里插入图片描述

捕获所有异常
try:
    int('abc')
    sum = 1 + '1'
    f = open('我为什么是一个文件.txt')#当该文件不存在时,这个代码就会有异常
    print(f.read())
    f.close()
except:
    print('出错啦')

在这里插入图片描述
注意:try语句检测范围一旦出现异常,剩下的语句将不会被执行

对多个异常统一处理
try:
    sum = 1 + '1'
    f = open('我为什么是一个文件.txt')#当该文件不存在时,这个代码就会有异常
    print(f.read())
    f.close()
except (OSError, TypeError):#注意哦,元组形式
    print('出错啦')

在这里插入图片描述

try-finally语句

try:
检测范围
except Exception[as reason]:
出现异常(Exception)后的处理代码
finally:
无论如何都会被执行的代码

如果异常发生在打开文件后,此时Python将直接跳到except语句,即文件打开了,但关闭文件的命令却被跳过了

try:
    f = open('我为什么是一个文件.txt','w')
    print(f.write('我存在了'))
    sum = 1 + '1'
    f.close()
except (OSError, TypeError):#注意哦,元组形式
    print('出错啦')

在这里插入图片描述
为了实现“就算出现异常,但也不得不执行的收尾工作”,引入finally来扩展try:

try:
    f = open('我为什么是一个文件.txt','w')
    print(f.write('我存在了'))
    sum = 1 + '1'
except (OSError, TypeError):#注意哦,元组形式
    print('出错啦')
finally:
    f.close()

summary:如果try语句块中没有出现任何运行时错误,会跳过except语句快执行finally语句块的内容。如果出现异常,则会先执行except语句块的内容再执行finally语句块的内容。finally语句块中的内容就算确保无论如何都将被执行的内容

raise语句

代码自己抛出异常
在这里插入图片描述

Task

0. 我们使用什么方法来处理程序中出现的异常?
except、finally语句块
使用 try……except 搭配来捕获处理程序中出现的异常。
try:
检测范围
except Exception[as reason]:
出现异常(Exception)后的处理代码

1. 一个 try 语句可以和多个 except 语句搭配吗?为什么?
可以, try 语句块中可能出现多类异常,利用多个 except 语句可以分别捕获并处理我们感兴趣的异常。

2. 你知道如何统一处理多类异常吗?
用元组的形式
3. except 后边如果不带任何异常类,Python 会捕获所有(try 语句块内)的异常并统一处理,但小甲鱼却不建议这么做,你知道为什么吗?
因为它会隐藏程序员未想到并且未做好处理准备的错误,例如用户输入ctrl+c试图终止程序会被解释为KeyboardInterrupt异常
4. 如果异常发生在成功打开文件后,Python 跳到 except 语句执行,并没有执行关闭文件的命令(用户写入文件的数据就可能没有保存起来),因此我们需要确保无论如何(就算出了异常退出)文件也要被关闭,我们应该怎么做呢?
使用finally语句块执行关闭文件的操作
5. 请恢复以下代码中马赛克挡住的内容,使得程序执行后可以按要求输出。
在这里插入图片描述
输出
在这里插入图片描述

try:
    for i in range(3):
        for j in range(3):
            if i == 2:
                raise KeyboardInterrupt
            print(i, j)
except KeyboardInterrupt:
    print('退出啦!')

6. 还记得我们第一个小游戏吗?只要用户输入非整型数据,程序立刻就会蹦出不和谐的异常信息然后崩溃。请使用刚学的异常处理方法修改以下程序,提高用户体验。
猜数字小游戏:

import random

secret = random.randint(1,10)
print('------------------我爱鱼C工作室------------------')
temp = input("不妨猜一下小甲鱼现在心里想的是哪个数字:")
guess = int(temp)
while guess != secret:
    temp = input("哎呀,猜错了,请重新输入吧:")
    guess = int(temp)
    if guess == secret:
        print("我草,你是小甲鱼心里的蛔虫吗?!")
        print("哼,猜中了也没有奖励!")
    else:
        if guess > secret:
            print("哥,大了大了~~~")
        else:
            print("嘿,小了,小了~~~")
print("游戏结束,不玩啦^_^")

try:
    import random

    secret = random.randint(1,10)
    print('------------------我爱鱼C工作室------------------')
    temp = input("不妨猜一下小甲鱼现在心里想的是哪个数字:")
    guess = int(temp)
    while guess != secret:
        temp = input("哎呀,猜错了,请重新输入吧:")
        guess = int(temp)
        if guess == secret:
            print("我草,你是小甲鱼心里的蛔虫吗?!")
            print("哼,猜中了也没有奖励!")
        else:
            if guess > secret:
                print("哥,大了大了~~~")
            else:
                print("嘿,小了,小了~~~")
except ValueError as reason:
    print('类型出错啦\n错误的原因是:' + str(reason))
finally:
    print("游戏结束,不玩啦^_^")

在这里插入图片描述
小甲鱼:

import random

secret = random.randint(1,10)
print('------------------我爱鱼C工作室------------------')
try:
    temp = input("不妨猜一下小甲鱼现在心里想的是哪个数字:")    
    guess = int(temp)
except (ValueError, EOFError, KeyboardInterrupt):
    print('输入错误!')
    guess = secret
while guess != secret:
    temp = input("哎呀,猜错了,请重新输入吧:")
    guess = int(temp)
    if guess == secret:
        print("我草,你是小甲鱼心里的蛔虫吗?!")
        print("哼,猜中了也没有奖励!")
    else:
        if guess > secret:
            print("哥,大了大了~~~")
        else:
            print("嘿,小了,小了~~~")
print("游戏结束,不玩啦^_^")

7.input() 函数有可能产生两类异常:EOFError(文件末尾endoffile,当用户按下组合键 Ctrl+d 产生)和 KeyboardInterrupt(取消输入,当用户按下组合键 Ctrl+c 产生),再次修改上边代码,捕获处理 input() 的两类异常,提高用户体验。

try:
    import random

    secret = random.randint(1,10)
    print('------------------我爱鱼C工作室------------------')
    temp = input("不妨猜一下小甲鱼现在心里想的是哪个数字:")
    guess = int(temp)
    while guess != secret:
        temp = input("哎呀,猜错了,请重新输入吧:")
        guess = int(temp)
        if temp == 'Ctrl'+ 'd':
            raise EOFError
        if temp == 'Ctrl'+ 'c':
            raise KeyboardInterrupt5
    if guess == secret:
        print("我草,你是小甲鱼心里的蛔虫吗?!")
        print("哼,猜中了也没有奖励!")
    else:
        if guess > secret:
            print("哥,大了大了~~~")
        else:
            print("嘿,小了,小了~~~")
except ValueError as reason:
    print('类型出错啦\n错误的原因是:' + str(reason))
except KeyboardInterrupt:
    print('退出啦')
except EOFError:
    print('文件末尾endoffile')

在这里插入图片描述
8. 尝试一个新的函数 int_input(),当用户输入整数的时候正常返回,否则提示出错并要求重新输入
程序实现如图:

在这里插入图片描述
小甲鱼代码:

def int_input(prompt=''):
    while True:
        try:
            int(input(prompt))
            break
        except ValueError:
            print('出错,您输入的不是整数!')

int_input('请输入一个整数:')

我的
在这里插入图片描述

def int_input(a):
    while 1:
        try:
            a = input('请输入一个整数:')
            if  int(a)  or int(a) == 0::#这种格式是判断变量的性质,等号,赋值符号是判断变量的内容

                break
            else:
                raise ValueError
        except ValueError:
            print('出错,您输入的不是整数!')
int_input('请输入一个整数:')

在这里插入图片描述
9. 把文件关闭放在 finally 语句块中执行还是会出现问题,像下边这个代码,当前文件夹中并不存在"My_File.txt"这个文件,那么程序执行起来会发生什么事情呢?你有办法解决这个问题吗?
由于finally语句块里试图去关闭一个并没有成功打开的文件,因此会弹出错误内容如下:

>>> 出错啦:[Errno 2] No such file or directory: 'My_File.txt'
Traceback (most recent call last):
  File "C:\Users\FishC000\Desktop\test.py", line 7, in <module>
    f.close()
NameError: name 'f' is not defined

小甲鱼代码

try:
    f = open('My_File.txt') # 当前文件夹中并不存在"My_File.txt"这个文件T_T
    print(f.read())
except OSError as reason:
    print('出错啦:' + str(reason))
finally:
    if 'f' in locals(): # 如果文件对象变量存在当前局部变量符号表的话,说明打开成功
        f.close()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值