Skip to content

第5天:异常处理练习

大家好!今天我们学习了Python中的异常处理机制。现在让我们通过一些有趣的练习来巩固这些知识吧!

练习目标

  • 掌握基本的try-except异常处理结构
  • 学会捕获特定类型的异常
  • 理解try-except-else和try-except-finally的用法
  • 能够主动抛出异常
  • 学会创建和使用自定义异常

练习题

练习1:安全的除法计算器

编写一个安全的除法计算器程序,功能如下:

  1. 提示用户输入两个数字
  2. 使用异常处理机制处理可能发生的错误:
    • 如果用户输入的不是数字,捕获ValueError异常并提示用户
    • 如果用户输入的第二个数字是0,捕获ZeroDivisionError异常并提示用户
  3. 如果计算成功,打印计算结果

示例交互

请输入第一个数字:abc
错误:请输入有效的数字!

请输入第一个数字:10
请输入第二个数字:0
错误:除数不能为零!

请输入第一个数字:10
请输入第二个数字:2
计算结果:5.0

练习2:文件读取器

编写一个文件读取器程序,功能如下:

  1. 提示用户输入一个文件路径
  2. 使用异常处理机制处理可能发生的错误:
    • 如果文件不存在,捕获FileNotFoundError异常并提示用户
    • 如果没有权限读取文件,捕获PermissionError异常并提示用户
    • 处理其他可能发生的异常
  3. 如果文件读取成功,打印文件的前10行内容
  4. 使用finally块或with语句确保文件被正确关闭

示例交互

请输入文件路径:non_existent_file.txt
错误:找不到文件 'non_existent_file.txt'

请输入文件路径:example.txt
文件内容:
这是文件的第一行
这是文件的第二行
...

练习3:带参数校验的函数

编写一个名为calculate_rectangle_area的函数,功能如下:

  1. 接受两个参数:length(长度)和width(宽度)
  2. 在函数内部进行参数校验:
    • 如果参数不是数字类型,抛出TypeError异常,提示信息为"长度和宽度必须是数字类型!"
    • 如果参数小于等于0,抛出ValueError异常,提示信息为"长度和宽度必须是正数!"
  3. 如果参数校验通过,计算并返回矩形的面积(公式:面积 = 长度 * 宽度)
  4. 在主程序中调用这个函数,并使用异常处理机制捕获可能发生的异常

示例输出

长度为5,宽度为3的矩形面积是:15
错误:长度和宽度必须是数字类型!
错误:长度和宽度必须是正数!

练习4:年龄验证器

编写一个名为verify_age的函数,功能如下:

  1. 接受一个参数:age(年龄)
  2. 在函数内部进行参数校验:
    • 如果参数不是整数,抛出TypeError异常,提示信息为"年龄必须是整数!"
    • 如果参数小于0,抛出ValueError异常,提示信息为"年龄不能为负数!"
    • 如果参数大于150,抛出ValueError异常,提示信息为"年龄不可能这么大!"
  3. 如果年龄在18岁及以上,返回"成年人";否则返回"未成年人"
  4. 在主程序中调用这个函数,并使用异常处理机制捕获可能发生的异常

示例输出

20岁是成年人
15岁是未成年人
错误:年龄必须是整数!
错误:年龄不能为负数!
错误:年龄不可能这么大!

练习5:自定义异常

创建一个名为InvalidPasswordError的自定义异常类,功能如下:

  1. 自定义异常类继承自Exception
  2. 编写一个名为validate_password的函数,接受一个参数:password(密码)
  3. 在函数内部进行密码校验:
    • 如果密码长度小于8位,抛出InvalidPasswordError异常,提示信息为"密码长度不能少于8位!"
    • 如果密码不包含数字,抛出InvalidPasswordError异常,提示信息为"密码必须包含至少一个数字!"
    • 如果密码不包含大写字母,抛出InvalidPasswordError异常,提示信息为"密码必须包含至少一个大写字母!"
  4. 在主程序中调用这个函数,并使用异常处理机制捕获可能发生的异常

提示:可以使用字符串的isdigit()方法和isupper()方法来检查字符是否为数字或大写字母

示例输出

密码验证成功!
错误:密码长度不能少于8位!
错误:密码必须包含至少一个数字!
错误:密码必须包含至少一个大写字母!

挑战题(可选)

如果你觉得上面的练习太简单了,试试这些挑战题:

挑战1:高级计算器

编写一个高级计算器程序,功能如下:

  1. 支持加、减、乘、除四种运算
  2. 提示用户输入两个数字和一个运算符
  3. 使用异常处理机制处理可能发生的各种错误:
    • 输入错误(非数字、无效运算符等)
    • 运算错误(除数为零等)
  4. 实现连续计算功能,允许用户进行多次运算,直到用户选择退出
  5. 使用try-except-else-finally结构来组织代码

示例交互

===== 高级计算器 =====
请输入第一个数字:10
请输入运算符(+, -, *, /):+
请输入第二个数字:5
计算结果:15

是否继续计算?(y/n):y
请输入第一个数字:20
请输入运算符(+, -, *, /):/
请输入第二个数字:0
错误:除数不能为零!

是否继续计算?(y/n):n
感谢使用计算器,再见!

挑战2:文件复制器

编写一个文件复制器程序,功能如下:

  1. 提示用户输入源文件路径和目标文件路径
  2. 使用异常处理机制处理可能发生的各种错误:
    • 源文件不存在
    • 没有权限读取源文件或写入目标文件
    • 文件复制过程中发生的其他错误
  3. 使用with语句自动管理文件资源
  4. 复制完成后,显示复制成功的消息和文件大小

示例交互

请输入源文件路径: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)

记住,编程的乐趣在于不断尝试和探索。不要害怕犯错,每一次错误都是进步的机会!祝你练习愉快!

© 2025 技术博客. All rights reserved by 老周有AI