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)

执行代码:

posted @ 2022-10-27 20:26  夏空下  阅读(524)  评论(0)    收藏  举报