Day 25: Python异常处理机制
Review
上一节主要是熟悉os
等python
中的文件操作,包含:
- 基础操作:目录获取、文件列举、路径拼接
- 系统交互:环境变量管理、跨平台兼容性
- 高级功能:目录树遍历、文件系统分析
Today
今天专注于Python的异常处理机制。在借助AI写代码时,经常会遇到try-except
的异常处理模块。这是因为大部分大模型在后训练阶段都经过强化学习训练,为了确保结果的正确运行,采用try-except
异常处理能提高模型运行成功的概率。
异常处理机制概述
Python的异常处理机制为程序提供了强大的容错能力(fault tolerance)。当程序在运行时遇到意外情况(即异常),它不会直接崩溃,而是可以被设计成优雅地处理这些错误。
当异常发生时,Python会创建一个异常对象(exception object)。如果这段可能出错的代码位于try
语句块中,程序流程会寻找并跳转到匹配的except
语句块来处理这个异常。
常见的Python异常类型
1. SyntaxError(语法错误)
- 原因:代码不符合Python的语法规则,解释器在解析代码时就会失败
- 特点:在程序运行之前就会被检测到
# 示例:缺少冒号
# def my_function()
# print("Hello")
2. NameError(名称错误)
- 原因:尝试使用一个未被定义的变量、函数或对象
# print(some_undefined_variable) # 变量未定义
3. TypeError(类型错误)
- 原因:对不支持该操作的数据类型执行了某个操作
# print("Age: " + 25) # 字符串和整数不能直接相加
4. ValueError(值错误)
- 原因:函数接收到的参数类型正确,但其值不合适
# number = float("12.34.56") # 不是有效的浮点数表示
5. IndexError(索引错误)
- 原因:尝试访问序列中不存在的索引
# data = ("apple", "banana")
# print(data[2]) # 索引超出范围
6. KeyError(键错误)
- 原因:尝试访问字典中不存在的键
# student_grades = {"math": 90, "science": 85}
# print(student_grades["history"]) # 键不存在
7. AttributeError(属性错误)
- 原因:尝试访问对象没有的属性或方法
# a_string = "hello"
# print(a_string.length) # 应该用 len(a_string)
8. ZeroDivisionError(除零错误)
- 原因:尝试将数字除以零
# result = 10 / 0
9. FileNotFoundError(文件未找到错误)
- 原因:尝试打开不存在的文件或路径不正确
# import pandas as pd
# data = pd.read_csv("nonexistent.csv")
10. ModuleNotFoundError(模块未找到错误)
- 原因:尝试导入不存在的模块
# import nonexistent_module
错误信息的解读
当代码出现错误时,程序会打印出"traceback"(回溯信息),包含:
- 错误类型(如NameError, TypeError)
- 错误发生的文件名和行号
- 导致错误的代码行
- 错误的简要描述
try-except基本用法
# 基本结构
try:# 可能会引发异常的代码result = numerator / denominator
except ZeroDivisionError:# 当发生除零错误时执行print("错误:除数不能为零!")result = "未定义"
捕获多种异常
def safe_divide(a, b):try:result = a / bexcept ZeroDivisionError:print("错误:除数不能为零!")return Noneexcept TypeError:print("错误:输入必须是数字!")return Noneelse:# 只有当try块成功执行时才会执行print(f"计算成功,结果是: {result}")return result
try-except-else-finally完整结构
try:# 可能引发异常的代码file = open('data.txt', 'r')data = file.read()
except FileNotFoundError:# 处理文件不存在的情况print("文件未找到")data = None
else:# try成功时执行print("文件读取成功")process_data(data)
finally:# 无论如何都会执行(清理资源)if 'file' in locals() and not file.closed:file.close()print("文件已关闭")
finally在ML/DL项目中的应用
finally
子句的"保证执行"特性在机器学习和深度学习项目中特别重要:
- 日志文件管理:确保训练日志被正确保存
- 计算资源释放:GPU内存、分布式计算资源的释放
- 数据库连接关闭:避免连接泄漏
- 全局状态恢复:恢复修改过的配置或环境变量
- 检查点保存:训练中断时保存模型状态
# ML训练示例
try:model = load_model()model.train(epochs=100)
except KeyboardInterrupt:print("训练被中断")
except RuntimeError as e:print(f"训练错误: {e}")
else:print("训练成功完成")save_final_model(model)
finally:# 无论如何都要执行的清理工作save_checkpoint(model)release_gpu_memory()close_tensorboard_writer()
最佳实践建议
- 具体化异常类型:避免使用裸露的
except
,应指定具体的异常类型 - 记录错误信息:在
except
块中记录详细的错误信息,便于调试 - 适度使用:不要过度使用异常处理来控制正常的程序流程
- 资源管理:优先使用
with
语句进行资源管理,它隐式使用了finally
机制
小结
异常处理是Python编程的重要组成部分。通过合理使用try-except-else-finally
结构,我们可以:
- 提高程序的健壮性和用户体验
- 优雅地处理各种错误情况
- 确保资源被正确释放
- 在ML/DL项目中构建更稳定的训练流程
浙大疏锦行