【小甲鱼Python】异常处理:你不可能总是对的2&&课后作业

笔记

try语句

形式一:try-except

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

[]括起来的部分是可选参数,reason只是个变量名,用别的名称代替也可以。

1.当文件不存在时:

 

2.一个try语句可以与多个except搭配使用,例如:

或是用一个except也可以起到检测多种异常的效果:

try:
    f = open('s.txt')
    sum = 1 + '1'
    f.close()
except (OSError,TypeError) as reason:
    print('出错了:' + str(reason))

3.如果只是希望出错后反馈一个用户能看得懂的异常,可以:

但是不推荐这么做,一方面,这不利于编程人员判断出错类型;另一方面,如果用户只是单纯地想用ctrl+c来终止程序运行,也会返回一个 “出错啦T_T” 的提示。因为ctrl + c返回的KeyboardInterrupt异常会被except捕获。

 

4.try语句的检测范围内一旦出现异常,剩下的语句不会被执行:

下图中,执行到int('abc')时出现异常,检测范围内第3-6行的代码跳过不执行,由于except中没有包含此异常,故后面的except的内容也不执行。

再如下图,执行到sum = 1 + '1'出现异常,直接跳到第二个except处继续执行,中间部分一概不执行。

 

5.同时对多个异常进行统一处理:

不论是捕获到OSError还是TypeError,都会打印‘出错啦T_T’。

 

形式二:try-finally

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

对如下例子,当执行到sum = 1 + '1'时会跳过f.close(),这会使得打开的文件没有关闭,写入的内容没有被保存,引起数据丢失。

而使用try-finally就可以很好地解决该问题:

raise语句

raise Exception[(相关的解释文本字符串)]

例如:

如果只有raise:

返回  运行异常:没有可用于激活的异常


课后作业

测试题:来自:bbs.fishc.com
  bw$Bfr9;y={._zN4dPk`-@]
0. 我们使用什么方法来处理程序中出现的异常?

答:

使用 try……except 搭配来捕获处理程序中出现的异常。"Xj=$)R
try:版权属于:bbs.fishc.com
        检测范围来自:bbs.fishc.com
except Exception[as reason]:r&Fijw]E
        出现异常(Exception)后的处理代码
Y%f+


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


2. 你知道如何统一处理多类异常吗?版权属于:bbs.fishc.com

答:例如:

try:
    f = open('s.txt')
    sum = 1 + '1'
    f.close()
except (OSError,TypeError) as reason:
    print('出错了:' + str(reason))


3. except 后边如果不带任何异常类,Python 会捕获所有(try 语句块内)的异常并统一处理,但小甲鱼却不建议这么做,你知道为什么吗?nu^:M.jzD
答:因为它会隐藏所有程序员未想到并且未做好准备处理的错误,例如用户输入ctrl+c试图终止程序会被解释为KeyboardInterrupt异常。


4. 如果异常发生在成功打开文件后,Python 跳到 except 语句执行,并没有执行关闭文件的命令(用户写入文件的数据就可能没有保存起来),因此我们需要确保无论如何(就算出了异常退出)文件也要被关闭,我们应该怎么做呢?}ucH'CD
答:使用try-finally形式,在finally:后加上关闭文件的代码。


5. 请恢复以下代码中马赛克挡住的内容,使得程序执行后可以按要求输出。1;`Ji(uD
Jxy{ODSM}YA^is?X0PFK4LB;
代码:Powered by bbs.fishc.com

Jn({ZUA"tcP3^*MKF+!g#L7kC_
输出:版权属于:bbs.fishc.com

答:

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

启发:可以利用try-except形式和raise制造异常的搭配跳出多重循环。


动动手:Powered by bbs.fishc.com
#8wV*QdE@"_{lnT t6H`sS;-IA&N2C
0. 还记得我们第一个小游戏吗?只要用户输入非整型数据,程序立刻就会蹦出不和谐的异常信息然后崩溃。请使用刚学的异常处理方法修改以下程序,提高用户体验。.j7Av`@lw
<WsJ7wUDf8T$F^Z3;->B
猜数字小游戏:版权属于:bbs.fishc.com

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("游戏结束,不玩啦^_^")

答:

import random


secret = random.randint(1,10)
print('------------------我爱鱼C工作室------------------')
temp = input("不妨猜一下小甲鱼现在心里想的是哪个数字:")
try:
    guess = int(temp)
except ValueError:
    print('输入错误!')
    guess = secret

while guess != secret:
    temp = input("哎呀,猜错了,请重新输入吧:")
    guess = int(temp)
    if guess == secret:
        print("我草,你是小甲鱼心里的蛔虫吗?!")
        print("哼,猜中了也没有奖励!")
    else:
        if guess > secret:
            print("哥,大了大了~~~")
        else:
            print("嘿,小了,小了~~~")
print("游戏结束,不玩啦^_^")

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

答:

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("游戏结束,不玩啦^_^")


2. 尝试一个新的函数 int_input(),当用户输入整数的时候正常返回,否则提示出错并要求重新输入。%[?gvfFR:T
C$B<tDMescZ.,G2gHFXPb[k*LT}"a5
程序实现如图:

答:

def int_input():
    while 1:
        temp = input('请输入一个整数:')
        try:
            result = int(temp)
            break
        except ValueError:
            print('出错,您输入的不是整数!')    
    return result

int_input()


3. 把文件关闭放在 finally 语句块中执行还是会出现问题,像下边这个代码,当前文件夹中并不存在"My_File.txt"这个文件,那么程序执行起来会发生什么事情呢?你有办法解决这个问题吗?Z$h~

try:
    f = open('My_File.txt') # 当前文件夹中并不存在"My_File.txt"这个文件T_T
    print(f.read())

except OSError as reason:
    print('出错啦:' + str(reason))

finally:
    f.close()

答:报错:

出错啦:[Errno 2] No such file or directory: 'My_File.txt'
Traceback (most recent call last):
  File "C:\Users\57574\Desktop\test.py", line 9, 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、付费专栏及课程。

余额充值