当前位置:网站首页>第033讲:异常处理:你不可能总是对的2 | 课后测试题及答案
第033讲:异常处理:你不可能总是对的2 | 课后测试题及答案
2022-06-22 20:05:00 【ChaseTimLee】
测试题:
0. 我们使用什么方法来处理程序中出现的异常?
答:使用 try……except 搭配来捕获处理程序中出现的异常。
try:
检测范围
except Exception[as reason]:
出现异常(Exception)后的处理代码
1. 一个 try 语句可以和多个 except 语句搭配吗?为什么?
答:可以。因为 try 语句块中可能出现多类异常,利用多个 except 语句可以分别捕获并处理我们感兴趣的异常。
try:
sum = 1 + '1'
f = open('我是一个不存在的文档.txt')
print(f.read())
f.close()
except OSError as reason:
print('文件出错啦T_T\n错误原因是:' + str(reason))
except TypeError as reason:
print('类型出错啦T_T\n错误原因是:' + str(reason))
2. 你知道如何统一处理多类异常吗?
答:在 except 后边使用小括号“()”把多个需要统一处理的异常括起来:
try:
int('abc')
sum = 1 + '1'
f = open('我是一个不存在的文档.txt')
print(f.read())
f.close()
except (OSError, TypeError):
print('出错啦T_T\n错误原因是:' + str(reason))
3. except 后边如果不带任何异常类,Python 会捕获所有(try 语句块内)的异常并统一处理,但小甲鱼却不建议这么做,你知道为什么吗?
答:因为它会隐藏所有程序员未想到并且未做好准备处理的错误,例如用户输入ctrl+c试图终止程序会被解释为KeyboardInterrupt异常。
4. 如果异常发生在成功打开文件后,Python 跳到 except 语句执行,并没有执行关闭文件的命令(用户写入文件的数据就可能没有保存起来),因此我们需要确保无论如何(就算出了异常退出)文件也要被关闭,我们应该怎么做呢?
答:我们可以使用 finally 语句来实现,如果 try 语句块中没有出现任何运行时错误,会跳过 except 语句块执行 finally 语句块的内容。
如果出现异常,则会先执行 except 语句块的内容再接着执行 finally 语句块的内容。总之,finally 语句块里的内容就是确保无论如何都将被执行的内容!
5. 请恢复以下代码中马赛克挡住的内容,使得程序执行后可以按要求输出。
代码:
输出
try:
for i in range(3):
for j in range(3):
if i == 2:
raise KeyboardInterrupt
print(i, j)
except KeyboardInterrupt:
print('退出啦!')
动动手:
0. 还记得我们第一个小游戏吗?只要用户输入非整型数据,程序立刻就会蹦出不和谐的异常信息然后崩溃。请使用刚学的异常处理方法修改以下程序,提高用户体验。
猜数字小游戏:
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("游戏结束,不玩啦^_^")
答:这里对可能导致异常的 guess = int(temp) 进行监测
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("游戏结束,不玩啦^_^")
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(),当用户输入整数的时候正常返回,否则提示出错并要求重新输入。
程序实现如图:

def int_input(prompt=''):
while True:
try:
int(input(prompt))
break
except ValueError:
print('出错,您输入的不是整数!')
int_input('请输入一个整数:')
3. 把文件关闭放在 finally 语句块中执行还是会出现问题,像下边这个代码,当前文件夹中并不存在"My_File.txt"这个文件,那么程序执行起来会发生什么事情呢?你有办法解决这个问题吗?
try:
f = open('My_File.txt') # 当前文件夹中并不存在"My_File.txt"这个文件T_T
print(f.read())
except OSError as reason:
print('出错啦:' + str(reason))
finally:
f.close()
答:由于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()
边栏推荐
- csv新增一列
- [redis]配置文件
- 2022团体程序设计天梯赛L1
- Install MySQL in ECS (version 2022)
- [redis] cluster and common errors
- 优化求解器 | Gurobi的MVar类:矩阵建模利器、求解对偶问题的备选方案 (附详细案例+代码)
- Evaluation index and code realization (ndcg)
- Adblock屏蔽百度热搜
- [138. copy linked list with random pointer]
- 79- do not create desc descending index when you see order by XXX desc - there is book donation benefit at the end of the article
猜你喜欢
![[142. circular linked list II]](/img/c1/f3a0b863286e9eeda0ae4021420912.png)
[142. circular linked list II]
![[redis]redis persistence](/img/83/9af9272bd485028062067ee2d7a158.png)
[redis]redis persistence

2022 chemical automation control instrument examination exercises and online simulation examination

【21. 合并两个有序链表】
![[redis] cluster and common errors](/img/a5/94906b62b1ec0d549f9b72ff3db7f2.png)
[redis] cluster and common errors

2022年山东省安全员C证考试试题模拟考试平台操作
![[redis]配置文件](/img/1c/05c06d59c9efb5983f877822db333c.png)
[redis]配置文件

【206. 反转链表】

53 page intelligent campus intelligent system design scheme (download attached)
![[redis]三种新数据类型](/img/ce/8a048bd36b21bfa562143dd2e47131.png)
[redis]三种新数据类型
随机推荐
【链表中倒数第k个结点】
win10安装.net3.5.docx
PHP image making
Correspondence between int and char in C language
百家讲坛 武则天
杰理之硬件上 DACL 输出,DAC 输出左右声道的声音【篇】
[redis]配置文件
Learning websites that programmers must see
牛客 52次月赛 C 说谎的机器 (区间赋值操作由O(n^2)转为O(n)的复杂度)
Numpy learning notes (6) -- sum() function
第023、024讲:递归:这帮小兔崽子、汉诺塔 | 课后测试题及答案
94-SQL优化案例一则(用到的写法经常是被嫌弃的)
HarmonyOS应用开发培训第二次
[cm11 linked list splitting]
2022团体程序设计天梯赛L1
百家讲坛 大秦崛起(下部)
优化求解器 | Gurobi的MVar类:矩阵建模利器、求解对偶问题的备选方案 (附详细案例+代码)
Ultrafast transformers | redesign vit with res2net idea and dynamic kernel size, surpassing mobilevit
【160. 相交链表】
苹果CoreFoundation源代码