实验八 异常处理
一、实验学时:2学时
二、实验目的
- 了解异常基本概念及其常见表现形式
- 理解异常出现的各种原因和处理异常的必要性
- 掌握常用的异常处理结构
三、实验内容
- 编写程序,让用户输入两个整数start和end,然后输出这两个整数之间的一个随机数。要求考虑用户输入不是整数的情况,以及start>end的情况。根据实际情况进行适当提示或输出。
- 编写程序,在指定文件路径读方式打开指定文件名,要求如果文件不存在提示异常错误并且创建新的同名文件。
四、实验结果
-
编写程序,让用户输入两个整数start和end,然后输出这两个整数之间的一个随机数。要求考虑用户输入不是整数的情况,以及start>end的情况。根据实际情况进行适当提示或输出。
题目思路:分别重写两个自定义异常类型,第一个用来判断两个数是否是整数,另一个用来判断两个数的大小关系。在try块中利用raise进行异常的抛出即可,except中根据类型进行接受处理。
程序代码:
""" 程序名:实验8.1.py 功能:编写程序,让用户输入两个整数start和end,然后输出这两个整数之间的一个随机数。 要求考虑用户输入不是整数的情况,以及start>end的情况。根据实际情况进行适当提示或输出。 日期:2022.6.4 版本:1.0 """ import random # 自定义异常类 MyTypeError ,继承普通异常基类 Exception class MyTypeError(Exception): def __init__(self, value1, value2): self.value1 = value1 self.value2 = value2 def __str__(self): return str(self.value1, self.value2) # 自定义异常类 MyJudgeError ,继承普通异常基类 Exception class MyJudgeError(Exception): def __init__(self, value1, value2): self.value1 = value1 self.value2 = value2 def __str__(self): return str(self.value1, self.value2) try: start, end = map(eval, input("请输入两个整数(start & end):").split()) # split以空格分割去接收两个整数 if not (isinstance(start, int) and isinstance(end, int)): # 如果不是整数 raise MyTypeError(start, end) # 抛出MyTypeError if start > end: # 如果大小不正确 raise MyJudgeError(start, end) # 抛出MyJudgeError print(f"已生成随机数:{random.randint(start, end)}") except MyTypeError as e: print(f"MyTypeError:请输入整型数据,您输入的是:{e.value1} {e.value2}") except MyJudgeError as e: print(f"MyJudgeError:范围不正确!(start)>(end)!")
运行结果截图:
-
编写程序,在指定文件路径读方式打开指定文件名,要求如果文件不存在提示异常错误并且创建新的同名文件。
题目思路:利用os.path中的exists来判断文件是否存在,如果存在就打开文件,如果不存在则抛出异常,然后创建新同名文件即可。
程序代码:
""" 程序名:实验8.2.py 功能:编写程序,在指定文件路径读方式打开指定文件名,要求如果文件不存在提示异常错误并且创建新的同名文件。 日期:2022.6.4 版本:1.0 """ from os.path import exists try: filename = input("请输入文件:") if not exists(filename): # 如果文件不存在 raise IOError(filename) # 抛出IOError类型错误 else: # 如果存在就打开文件 with open(filename, 'r') as fp: print("打开成功!") fp.close() print("文件已关闭!") except IOError as e: print(f"{e}不存在") # 文件不存在时创建文件 with open(str(e), 'w') as fp: print(f"{e}创建成功") fp.close() print(f"{e}已关闭")
运行结果截图:
五、实验小结
问题和解决办法
-
用OSError抛出的异常来创建文件显示:expected str, bytes or os.PathLike object, not OSError
解决方法:OSError的异常为OSError对象,可以用str()进行转换,然后就可以当做文件名来使用。
-
不知道如何实现自定义异常。
解决方法:通过查询相关知识得知,需要自定义异常类 XXXX ,继承普通异常基类 Exception。
-
random()生成的都是小数,题目要求为整数。
解决方法:random.randint(a, b)返回的是(a,b)之间的一个整数。
心得体会
- 异常抛出是Python里面的一个非常好用的模块,他可以让我们在写代码的时候,使得错误处理代码变得更有条理,只需在一个地方处理错误。在我们编写的程序中,通过在 try 块中判断用户的输入数据是否合理,如果不合理,程序受 raise 的影响会进行到 except 代码块,对用户的错误输出进行处理,然后会继续执行正常的业务代码;反之,如果用户输入合理,那么程序将直接执行正常的业务代码。这样的话,使用 Python 异常处理机制,可以让程序中的异常处理代码和正常业务代码分离,使得程序代码更加优雅,并可以提高程序的健壮性。
- Python学习已经学习到了中后阶段,自我感觉对于Python的认识越来越深入,不仅是对一开始基础知识的应用,到现在的文件处理和异常处理,都是对我们日常生活有很大帮助的模块。