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

时间:2022-06-17
本文章向大家介绍小甲鱼《零基础学习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.请恢复以下代码中马赛克挡住的内容,使得程序执行后可以按要求输出。

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

修改后:

import random  
secret = random.randint(1,10)  
i = 3  
temp = input("猜一猜Allen心中的数字:")  
while True:  
    try:  
        number = int(temp)  
    except ValueError as reason:  
        print('类型出错啦n' + 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个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(),当用户输入整数的时候正常返回,否则提示出错并要求重新输入。程序实现如图:

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小甲鱼test003test0.py ==================
出错啦:[Errno 2] No such file or directory: 'My_File.txt'
Traceback (most recent call last):
  File "I:Python小甲鱼test003test0.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()