小甲鱼Python第033讲:异常处理:你不可能总是对的2| 课后测试题及参考答案
测试题:
0.我们使用什么方法来处理程序中出现的异常?
使用try......except搭配来捕获处理程序中的出现的异常。
try: 检测范围 except Exception[as reason]: 出现异常(Exception)后的处理代码
1.一个try语句可以和多个except语句搭配吗?为什么?
可以。因为try语句块中可能出现多类异常,利用多个except语句可以分别捕获并处理我们感兴趣的异常。
1 try: 2 sum = 1+'1' 3 f = open('我是一个不存在的文档.txt') 4 print(f.read) 5 f.close() 6 except OSError as reason: 7 print("文件出错了\n错误原因是:" + str(reason)) 8 except TypeError as reason: 9 print("类型出错了\n错误原因是:" + str(reason))
2.你知道如何统一处理多类异常吗?
在except后边使用小括号()把多个需要统一处理的异常括起来:
1 try: 2 int("abc") 3 sum = 1+'1' 4 f = open('我是一个不存在的文档.txt') 5 print(f.read) 6 f.close() 7 except (OSError,TypeError) as reason: 8 print("出错了\n错误原因是:" + str(reason))
3.except后边如果不带认识异常类,python会捕获所有(try语句块内)的异常并统一处理,但是小甲鱼却不建议这么做,你知道是为什么吗?
因为它会隐藏所有程序员未想到并且未作好处理的错误,例如用户输入ctrl+c试图终止程序会被解释为KeyboardInterrupt异常。
4.如果异常发生在成功打开文件后,python跳到except语句执行,并没有执行关闭文件的命令(用户写入文件的数据就可能没有保存起来),因此我们需要确保无论如何(就算出了一场退出)文件也要被关闭,我们应该怎么做呢?
我们可以使用finally语句来实现,如果try语句块中没有出现任何运行时错误,会跳过except语句块执行finally语句块的内容。
如果出现异常,则会先执行except语句块的内容再接着执行finally语句块的内容,总之,finally语句块里的内容就是确保无论如何都将被执行的内容!
5.请恢复以下代码中马赛克挡住的内容,使用程序执行后可以按要求输出。
实现代码:
1 try: 2 for i in range(3): 3 for j in range(3): 4 if i == 2: 5 raise KeyboardInterrupt 6 print(i,j) 7 except KeyboardInterrupt: 8 print("退出了!")
动动手:
0.还记得我们第一个小游戏吗?只要用户输入非整数数据,程序立刻就会蹦出来不和谐的异常信息然后崩溃,请使用刚学的异常处理方法修改一下程序,提高用户体验。
猜数字小游戏:
1 import random 2 3 secret = random.randint(1,10) 4 print("--------------------小鱼儿工作室-------------------") 5 temp= input("不妨猜一下小甲鱼现在心里想的是哪个数字:") 6 guess = int(temp) 7 while guess != secret: 8 temp = input("哎呀,猜错了。请重新输入吧:") 9 guess = int(temp) 10 if guess == secret: 11 print("WC,你是小甲鱼心里的蛔虫吗?!") 12 print("猜中了呢!") 13 else: 14 if guess >secret: 15 print("哥,大了大了") 16 else: 17 print("嘿,小了小了") 18 print("游戏结束,不玩了~~")
优化代码:主要在guess= int(temp)上当输入的temp不是整数型的时候,会出现异常。
1 import random 2 3 secret = random.randint(1,10) 4 print("--------------------小鱼儿工作室-------------------") 5 temp= input("不妨猜一下小甲鱼现在心里想的是哪个数字:") 6 try: 7 guess = int(temp) 8 except ValueError: 9 print("输入错误,请输入整数。")
guess = secret 10 while guess != secret: 11 temp = input("哎呀,猜错了。请重新输入吧:") 12 guess = int(temp) 13 if guess == secret: 14 print("WC,你是小甲鱼心里的蛔虫吗?!") 15 print("猜中了呢!") 16 else: 17 if guess >secret: 18 print("哥,大了大了") 19 else: 20 print("嘿,小了小了") 21 print("游戏结束,不玩了~~")
1.input()函数有可能产生两类异常:EOFError(文件末尾endoffice,当用户按下组合键CTRL+d产生)和KeyboardInterrupt(取消输入,当用户按下组合键Ctrl+c产生),再次修改上边代码,捕获处理input()的两类异常,提高用户体验。
实现代码:
1 import random 2 3 secret = random.randint(1,10) 4 print("--------------------小鱼儿工作室-------------------") 5 try: 6 temp = input("不妨猜一下小甲鱼现在心里想的是哪个数字:") 7 guess = int(temp) 8 except (EOFError, KeyboardInterrupt, ValueError): 9 print("输入错误,请输入整数。") 10 guess = secret 11 while guess != secret: 12 temp = input("哎呀,猜错了。请重新输入吧:") 13 guess = int(temp) 14 if guess == secret: 15 print("WC,你是小甲鱼心里的蛔虫吗?!") 16 print("猜中了呢!") 17 else: 18 if guess >secret: 19 print("哥,大了大了") 20 else: 21 print("嘿,小了小了") 22 print("游戏结束,不玩了~~")
2.尝试一个新的函数int_input(),当用户输入整数的时候正常返回,否则提示出错并要求重新输入。
程序实现如图:
方法一:
1 def int_input(prompt): 2 while True: 3 try: 4 int(input(prompt)) 5 break 6 except ValueError: 7 print("出错,您输入的不是整数!") 8 9 int_input("请输入一个整数:")
方法二:
1 def int_input1(): 2 temp = input("请输入一个整数:") 3 try : 4 num = int(temp) 5 except ValueError: 6 print("出错了~~!!") 7 int_input1() 8 int_input1()
3.把文件关闭在finally语句块中执行还是会出现问题,像下边这个代码,当前文件夹中并不存在‘My_File.txt’这个文件,那么程序执行起来会发生什么事情呢?你有办法解决这个问题吗?
1 try: 2 f = open('My_File.txt') 3 print(f.read()) 4 except OSError as reason: 5 print("出错了:"+str(reason)) 6 finally: 7 f.close()
优化代码:
1 try: 2 f = open ("My_File.txt") # 当前文件夹中并不存在“My_File.txt”这个文件 3 print(f.read()) 4 except OSError as reason: 5 print("出错了:" +str(reason)) 6 finally: 7 if 'f' in locals(): # 如果文件对象变量存在当前局部变量符号表的话,说明打开成功 8 f.close()