小甲鱼《零基础学习Python》课后笔记(三十三):异常处理——你不可能总是对的2

测试题
0.我们使用什么方法来处理程序中出现的异常?
使用try方法,包括try-except语句和try-finally语句。
①try-except

try:
	检测范围
except 异常类型 as e:
	对应异常的处理程序

②try-finally

try:
	检测范围
except 异常类型 as e:
	对应异常的处理程序
finally:
	无论如何都会执行的代码
1.一个try语句可以和多少个except语句搭配?为什么? 可以,因为except可以和多种异常类型搭配,处理多种异常。 2.你知道如何统一处理多类异常吗? 可以使用except (Exception1, Exception2, Exception3…),这样只要是括号里出现的异常,都会执行except后的异常处理程序。 3.except后如果不带任何异常类,Python会捕获所有(try语句块内)的异常并统一处理,但小甲鱼不建议这么做,你知道为什么吗? 因为这样会屏蔽掉程序员未考虑到的异常,不利于程序的调试和维护,就算出错也不知道具体异常。 4.如果异常发生在成功打开文件后,Python跳到except语句执行,并没有执行关闭文件的命令(用户写入文件的数据就可能没有保存起来),因此我们需要无论如何(就算出了异常退出)文件也要被关闭,我们应该怎么做呢? 可以使用try-finally语句,在finally语句里f.colse()对文件进行关闭保存。 5.请恢复以下代码中马赛克挡住的内容,使得程序执行后可以按要求输出。 ![](https://img-blog.csdn.net/20180916163718676?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI0NTQ2MTM3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) ```python try: for i in range(3): for j in range(3): if i == 2: raise KeyboardInterrupt print(i, j) except KeyboardInterrupt: print('退出啦!') ``` raise可以产生异常。

动动手
0.还记得我们额小游戏吗?只要用户输入非整形数据,程序立刻就会蹦出不和谐的异常信息然后奔溃。请使用刚学的异常处理方法修改以下程序,提高用户体验。

import random
secret = random.randint(1,10)
i = 3
temp = input("猜一猜Allen心中的数字:")  
number = int(temp)  
while (i > 0):
    if(number == secret):
        print("哇,你是Allen肚里的蛔虫吗?")
        print("奖励一个香吻!")
        break
    else:
        if number > secret:
            print("大了大了!")
        else:
            print("小了小了!")
        if i > 1:
            temp = input("哎呀!再猜猜看:")  
            number = int(temp)  
    i = i -1
print("游戏结束,不玩啦!")

修改后:


这里加了2个break,主要是except语句处理后不会退出程序,而且还会报错NameError: name ‘number’ is not defined,所以做了改进。

1.input()函数有可能产生两类异常:EOFError(文件末尾endoffile,当用户按下组合键Ctrl+d产生)和KeyboardInterrupt(取消输入,当用户按下组合键Ctrl+c产生),再次修改上边的代码,捕获处理input()的两类异常,提高用户体验。
import random
secret = random.randint(1,10)
i = 3
while True:
	try:
		temp = input("猜一猜Allen心中的数字:")
		number = int(temp)
	except (ValueError, EOFError, KeyboardInterrupt) as reason:
		print('类型出错:' + str(reason))
		break
	number = int(temp)
	while (i > 0):
	    if(number == secret):
	        print("哇,你是Allen肚里的蛔虫吗?")
	        print("奖励一个香吻!")
	        break
	    else:
	        if number > secret:
	            print("大了大了!")
	        else:
	            print("小了小了!")
	        if i > 1:
	            temp = input("哎呀!再猜猜看:")  
	            number = int(temp)  
	    i = i -1
	print("游戏结束,不玩啦!")
	break
2.尝试一个新的函数int_input(),当用户输入整数的时候正常返回,否则提示出错并要求重新输入。程序实现如图: ![](https://img-blog.csdn.net/20180916163738820?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI0NTQ2MTM3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) ```python def int_input(): while True: try: number = int(input('请输入一个整数:')) break except ValueError: print('出错,您输入的不是整数!') ``` 3.把文件关闭放在finally语句块中执行还是会出现问题,像下边这个代码,当前文件夹中并不存在“My_File.txt”这个文件,那么程序执行起来会发生什么事情呢?你有办法解决这个问题吗?
try:  
	f = open('My_File.txt') #当前文件夹中并不存在“My_File.txt”这个文件  
	print(f.read())  
except OSError as reason:  
	print('出错啦:' + str(reason))  
finally: 
	f.close()  

出现异常,因为试图关闭一个不存在的文件对象

================== RESTART: I:\Python\小甲鱼\test003\test0.py ==================
出错啦:[Errno 2] No such file or directory: 'My_File.txt'
Traceback (most recent call last):
  File "I:\Python\小甲鱼\test003\test0.py", line 7, in <module>
    f.close()
NameError: name 'f' is not defined

修改后:

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

猜你喜欢

转载自blog.csdn.net/qq_24546137/article/details/82725721
今日推荐