第5天:异常处理练习
大家好!今天我们学习了Python中的异常处理机制。现在让我们通过一些有趣的练习来巩固这些知识吧!
练习目标
- 掌握基本的try-except异常处理结构
- 学会捕获特定类型的异常
- 理解try-except-else和try-except-finally的用法
- 能够主动抛出异常
- 学会创建和使用自定义异常
练习题
练习1:安全的除法计算器
编写一个安全的除法计算器程序,功能如下:
- 提示用户输入两个数字
- 使用异常处理机制处理可能发生的错误:
- 如果用户输入的不是数字,捕获
ValueError异常并提示用户 - 如果用户输入的第二个数字是0,捕获
ZeroDivisionError异常并提示用户
- 如果用户输入的不是数字,捕获
- 如果计算成功,打印计算结果
示例交互:
请输入第一个数字:abc
错误:请输入有效的数字!
请输入第一个数字:10
请输入第二个数字:0
错误:除数不能为零!
请输入第一个数字:10
请输入第二个数字:2
计算结果:5.0练习2:文件读取器
编写一个文件读取器程序,功能如下:
- 提示用户输入一个文件路径
- 使用异常处理机制处理可能发生的错误:
- 如果文件不存在,捕获
FileNotFoundError异常并提示用户 - 如果没有权限读取文件,捕获
PermissionError异常并提示用户 - 处理其他可能发生的异常
- 如果文件不存在,捕获
- 如果文件读取成功,打印文件的前10行内容
- 使用
finally块或with语句确保文件被正确关闭
示例交互:
请输入文件路径:non_existent_file.txt
错误:找不到文件 'non_existent_file.txt'
请输入文件路径:example.txt
文件内容:
这是文件的第一行
这是文件的第二行
...练习3:带参数校验的函数
编写一个名为calculate_rectangle_area的函数,功能如下:
- 接受两个参数:
length(长度)和width(宽度) - 在函数内部进行参数校验:
- 如果参数不是数字类型,抛出
TypeError异常,提示信息为"长度和宽度必须是数字类型!" - 如果参数小于等于0,抛出
ValueError异常,提示信息为"长度和宽度必须是正数!"
- 如果参数不是数字类型,抛出
- 如果参数校验通过,计算并返回矩形的面积(公式:面积 = 长度 * 宽度)
- 在主程序中调用这个函数,并使用异常处理机制捕获可能发生的异常
示例输出:
长度为5,宽度为3的矩形面积是:15
错误:长度和宽度必须是数字类型!
错误:长度和宽度必须是正数!练习4:年龄验证器
编写一个名为verify_age的函数,功能如下:
- 接受一个参数:
age(年龄) - 在函数内部进行参数校验:
- 如果参数不是整数,抛出
TypeError异常,提示信息为"年龄必须是整数!" - 如果参数小于0,抛出
ValueError异常,提示信息为"年龄不能为负数!" - 如果参数大于150,抛出
ValueError异常,提示信息为"年龄不可能这么大!"
- 如果参数不是整数,抛出
- 如果年龄在18岁及以上,返回"成年人";否则返回"未成年人"
- 在主程序中调用这个函数,并使用异常处理机制捕获可能发生的异常
示例输出:
20岁是成年人
15岁是未成年人
错误:年龄必须是整数!
错误:年龄不能为负数!
错误:年龄不可能这么大!练习5:自定义异常
创建一个名为InvalidPasswordError的自定义异常类,功能如下:
- 自定义异常类继承自
Exception类 - 编写一个名为
validate_password的函数,接受一个参数:password(密码) - 在函数内部进行密码校验:
- 如果密码长度小于8位,抛出
InvalidPasswordError异常,提示信息为"密码长度不能少于8位!" - 如果密码不包含数字,抛出
InvalidPasswordError异常,提示信息为"密码必须包含至少一个数字!" - 如果密码不包含大写字母,抛出
InvalidPasswordError异常,提示信息为"密码必须包含至少一个大写字母!"
- 如果密码长度小于8位,抛出
- 在主程序中调用这个函数,并使用异常处理机制捕获可能发生的异常
提示:可以使用字符串的isdigit()方法和isupper()方法来检查字符是否为数字或大写字母
示例输出:
密码验证成功!
错误:密码长度不能少于8位!
错误:密码必须包含至少一个数字!
错误:密码必须包含至少一个大写字母!挑战题(可选)
如果你觉得上面的练习太简单了,试试这些挑战题:
挑战1:高级计算器
编写一个高级计算器程序,功能如下:
- 支持加、减、乘、除四种运算
- 提示用户输入两个数字和一个运算符
- 使用异常处理机制处理可能发生的各种错误:
- 输入错误(非数字、无效运算符等)
- 运算错误(除数为零等)
- 实现连续计算功能,允许用户进行多次运算,直到用户选择退出
- 使用
try-except-else-finally结构来组织代码
示例交互:
===== 高级计算器 =====
请输入第一个数字:10
请输入运算符(+, -, *, /):+
请输入第二个数字:5
计算结果:15
是否继续计算?(y/n):y
请输入第一个数字:20
请输入运算符(+, -, *, /):/
请输入第二个数字:0
错误:除数不能为零!
是否继续计算?(y/n):n
感谢使用计算器,再见!挑战2:文件复制器
编写一个文件复制器程序,功能如下:
- 提示用户输入源文件路径和目标文件路径
- 使用异常处理机制处理可能发生的各种错误:
- 源文件不存在
- 没有权限读取源文件或写入目标文件
- 文件复制过程中发生的其他错误
- 使用
with语句自动管理文件资源 - 复制完成后,显示复制成功的消息和文件大小
示例交互:
请输入源文件路径:source.txt
请输入目标文件路径:target.txt
文件复制成功!共复制了1024字节。
请输入源文件路径:non_existent.txt
请输入目标文件路径:target.txt
错误:找不到源文件 'non_existent.txt'提交要求
- 将每个练习的代码保存到一个单独的Python文件中
- 在文件开头添加注释,说明这是哪个练习以及练习的目的
- 确保代码能够正常运行,没有语法错误
- 如果你遇到了问题,可以查阅今天的教案或在评论区提问
参考答案(仅供参考,不要直接复制哦!)
练习1参考答案:
python
# 练习1:安全的除法计算器
try:
num1 = float(input("请输入第一个数字:"))
num2 = float(input("请输入第二个数字:"))
result = num1 / num2
print(f"计算结果:{result}")
except ValueError:
print("错误:请输入有效的数字!")
except ZeroDivisionError:
print("错误:除数不能为零!")
except Exception as e:
print(f"发生了未知错误:{e}")练习2参考答案:
python
# 练习2:文件读取器
def read_file(file_path):
try:
with open(file_path, "r", encoding="utf-8") as file:
print("文件内容:")
for i, line in enumerate(file):
if i < 10: # 只打印前10行
print(line.strip())
else:
break
except FileNotFoundError:
print(f"错误:找不到文件 '{file_path}'")
except PermissionError:
print(f"错误:没有权限读取文件 '{file_path}'")
except Exception as e:
print(f"读取文件时发生错误:{e}")
file_path = input("请输入文件路径:")
read_file(file_path)记住,编程的乐趣在于不断尝试和探索。不要害怕犯错,每一次错误都是进步的机会!祝你练习愉快!




