Python实验报告(第8章)
实验9:异常处理及程序调试
一、实验目的和要求
1、了解Pyhon中常见的异常;
2、学会使用异常处理语句;
二、实验环境
软件版本:Python 3.10 64_bit
三、实验过程
1、实例1:模拟幼儿园分苹果
(1)在IDLE中创建一个名称为division_apple.py的文件,然后在该文件中定义一个模拟分苹果的函数division(),在该函数中,要求输出苹果的数量和小朋友的数量,然后应用除法算式计算分配的结果,最后调用division()函数。代码如下:
1 def division():
2 """功能:分苹果"""
3 print("\n=====================分苹果======================\n")
4 apple = int(input("请输入苹果的个数:")) # 输入苹果的数量
5 children = int(input("请输入来了几个小朋友:"))
6 result = apple // children # 计算每人分几个苹果
7 remain = apple - result * children # 计算余下几个苹果
8 if remain > 0:
9 print(apple,"个苹果,平均分给",children,"个小朋友,每人分",result,"个,剩下",remain,"个。")
10 else:
11 print(apple,"个苹果,平均分给",children,"个小朋友,每人分",result,"个。")
12 if __name__ == '__main__':
13 division() # 调用分苹果的函数
运行程序,当输入苹果和小朋友的数量都是10时:

如果在输入数量时,不小心把小朋友的人数输成了0:

(产生了ZeroDivisionError(除数为0错误)的根源在于算术表达式“10/0”中,0作为除数出现,所以正在执行的程序中被中断)
2、实例2:模拟幼儿园分苹果(除数不能为0)
(1)在IDLE中创建一个名称为division_apple_0.py的文件,然后将实例1的代码全部复制到该文件中,并且对“if __name__ =='__main__':”语句下面的代码进行修改,应用try...except语句捕获执行division()函数可能抛出的ZeroDivisionError(除数为零)异常,修改后的代码如下:
1 def division():
2 '''功能:分苹果'''
3 print("\n=====================分苹果======================\n")
4 apple = int(input("请输入苹果的个数:")) # 输入苹果的数量
5 children = int(input("请输入来了几个小朋友:"))
6 result = apple//children # 计算每人分几个苹果
7 remain = apple-result*children # 计算余下几个苹果
8 if remain>0:
9 print(apple,"个苹果,平均分给",children,"个小朋友,每人分",result,"个,剩下",remain,"个。")
10 else:
11 print(apple,"个苹果,平均分给",children,"个小朋友,每人分",result,"个。")
12 if __name__ == '__main__':
13 try: # 捕获异常
14 division() # 调用分苹果的函数
15 except ZeroDivisionError: # 处理异常
16 print("\n出错了 ~_~ ——苹果不能被0个小朋友分!")
执行以上的代码,输入苹果的数量为10,小朋友的人数为0时,将不再抛出异常:

将苹果和小朋友的数量输入成小数:

(2)可以看出,程序中要求输入整数,而实际输入的是小数,则抛出ValueError(传入的值错误)异常。要解决该问题,可以在实例02的代码中,为try...except语句再添加一个except语句,用于处理抛出ValueError异常的情况。修改后的代码如下:
1 def division():
2 '''功能:分苹果'''
3 print("\n=====================分苹果======================\n")
4 apple = int(input("请输入苹果的个数:")) # 输入苹果的数量
5 children = int(input("请输入来了几个小朋友:"))
6 result = apple//children # 计算每人分几个苹果
7 remain = apple-result*children # 计算余下几个苹果
8 if remain>0:
9 print(apple,"个苹果,平均分给",children,"个小朋友,每人分",result,"个,剩下",remain,"个。")
10 else:
11 print(apple,"个苹果,平均分给",children,"个小朋友,每人分",result,"个。")
12 if __name__ == '__main__':
13 try: # 捕获异常
14 division() # 调用分苹果的函数
15 except ZeroDivisionError: # 处理异常
16 print("\n出错了 ~_~ ——苹果不能被0个小朋友分!")
17 except ValueError as e: # 处理ValueError异常
18 print("输入错误:",e) # 输出错误原因
再次运行程序:

3、实例3:模拟幼儿园分苹果(每个人至少分到一个苹果)
(1)在IDLE中创建一个名称为division_apple_1.py的文件,然后将实例2的代码全部复制到该文件中,并且在第5行代码“children = int(input("请输入来了几个小朋友:"))”的下方添加一个if 语句,实现当苹果的数量小于小朋友的数量时,应用raise 语句抛出一个ValueError 异常,接下来再在最后一行语句的下方添加except 语句处理ValueError 异常。修改后的代码如下:
1 def division():
2 '''功能:分苹果'''
3 print("\n=====================分苹果======================\n")
4 apple = int(input("请输入苹果的个数:")) # 输入苹果的数量
5 children = int(input("请输入来了几个小朋友:"))
6 if apple < children:
7 raise ValueError("苹果太少了,不够分...")
8 result = apple//children # 计算每人分几个苹果
9 remain = apple - result*children # 计算余下几个苹果
10 if remain>0:
11 print(apple,"个苹果,平均分给",children,"个小朋友,每人分",result,"个,剩下",remain,"个。")
12 else:
13 print(apple,"个苹果,平均分给",children,"个小朋友,每人分",result,"个。")
14 if __name__ == '__main__':
15 try: # 捕获异常
16 division() # 调用分苹果的函数
17 except ZeroDivisionError : # 处理ZeroDivisionError异常
18 print("\n出错了 ~_~ ——苹果不能被0个小朋友分!")
19 except ValueError as e: # ValueError
20 print("\n出错了~_~ ——",e)
执行程序,输入苹果的数量为5,小朋友的数量为10:

4、实例4:模拟幼儿园分苹果(应用断言调试)
(1)在IDLE中创建一个名称为division_apple_dug.py的文件,然后将实例1的代码全部复制到该文件中,并且在第5行代码“children = int(input("请输入来了几个小朋友:"))”的下方添加一个assert语句,验证苹果的数量是否小于小朋友的数量。修改后的代码如下:
1 def division():
2 """功能:分苹果"""
3 print("\n=====================分苹果======================\n")
4 apple = int(input("请输入苹果的个数:")) # 输入苹果的数量
5 children = int(input("请输入来了几个小朋友:"))
6 assert apple >= children,"苹果不够分" # 应用断言调试
7 result = apple // children # 计算每人分几个苹果
8 remain = apple - result * children # 计算余下几个苹果
9 if remain > 0:
10 print(apple,"个苹果,平均分给",children,"个小朋友,每人分",result,"个,剩下",remain,"个。")
11 else:
12 print(apple,"个苹果,平均分给",children,"个小朋友,每人分",result,"个。")
13 if __name__ == '__main__':
14 division() # 调用分苹果的函数
运行执行,输入苹果的数量为5,小朋友的数量为10,将抛出AssertionError异常:

(2)为使得不会直接抛出异常,修改代码如下:
1 def division():
2 """功能:分苹果"""
3 print("\n=====================分苹果======================\n")
4 apple = int(input("请输入苹果的个数:")) # 输入苹果的数量
5 children = int(input("请输入来了几个小朋友:"))
6 assert apple >= children,"苹果不够分" # 应用断言调试
7 result = apple // children # 计算每人分几个苹果
8 remain = apple - result * children # 计算余下几个苹果
9 if remain > 0:
10 print(apple,"个苹果,平均分给",children,"个小朋友,每人分",result,"个,剩下",remain,"个。")
11 else:
12 print(apple,"个苹果,平均分给",children,"个小朋友,每人分",result,"个。")
13 if __name__ == '__main__':
14 try:
15 division() # 调用分苹果的函数
16 except AssertionError as e: # 处理AssertionError异常
17 print("\n输入有误:",e)
执行代码:


浙公网安备 33010602011771号