异常处理
原文:异常处理
一句话
学习Python中错误和异常的处理机制,包括捕获、触发和自定义异常。
什么时候翻这页
- 当你的Agent需要处理外部API调用可能出现的错误时
- 当你需要设计健壮的工具调用机制,处理各种可能的异常情况
- 当你的Agent需要向用户提供有意义的错误信息时
- 当你需要在异步操作中正确处理异常时
核心概念
- 语法错误:代码结构不符合Python语法规则,在解析阶段就会被检测到
- 异常:程序运行时检测到的错误,如果不处理会导致程序终止
- try-except语句:捕获和处理异常的基本结构
- finally子句:无论是否发生异常都会执行的清理代码
- 异常链:一个异常是由另一个异常引起的,可以使用
raise ... from ...语法 - 自定义异常:创建自己的异常类,通常继承自Exception类
- 异常组(ExceptionGroup):用于同时处理多个相关异常
- 异常注释:使用add_note()方法为异常添加额外信息
怎么做
- 基本异常处理:
try:
# 可能引发异常的代码
x = int(input("请输入一个数字: "))
result = 10 / x
except ValueError:
print("输入的不是有效的数字")
except ZeroDivisionError:
print("不能除以零")
else:
print(f"结果是: {result}")
finally:
print("执行完毕")
- 捕获多个异常:
try:
# 可能引发多种异常的代码
risky_operation()
except (ValueError, TypeError) as e:
print(f"数值错误: {e}")
except OSError as e:
print(f"系统错误: {e}")
- 自定义异常:
class MyCustomError(Exception):
"""自定义异常类"""
pass
try:
# 某些条件满足时引发自定义异常
if condition:
raise MyCustomError("发生了自定义错误")
except MyCustomError as e:
print(f"捕获到自定义异常: {e}")
- 异常链:
try:
# 尝试打开文件
f = open("important_file.txt")
data = f.read()
except IOError as e:
# 文件操作失败,引发更具体的异常
raise RuntimeError("无法处理文件数据") from e
- 异常组:
try:
# 可能引发多个异常的操作
process_multiple_items()
except* OSError as e:
print(f"处理文件系统错误: {e}")
except* ValueError as e:
print(f"处理数值错误: {e}")
命令 / API 速查
| 关键字/函数 | 描述 |
|---|---|
try | 开始一个try-except块 |
except | 捕获特定类型的异常 |
finally | 定义无论是否发生异常都会执行的代码 |
raise | 手动引发异常 |
raise ... from ... | 创建异常链 |
raise ... from None | 禁用异常链 |
Exception | 所有非系统退出异常的基类 |
BaseException | 所有异常的基类 |
add_note() | 为异常添加注释信息 |
ExceptionGroup | 异常组类,用于同时处理多个异常 |
except* | 捕获异常组中的特定类型异常 |
与 Agent 开发的联系
- Agent工具调用:当Agent调用外部API或工具时,必须处理可能出现的网络错误、超时、无效响应等异常,确保Agent不会因单一工具失败而完全停止工作。
- 结构化输出:Agent需要将捕获的异常转换为用户友好的消息,同时保留足够的技术细节用于调试,这可以通过自定义异常和异常注释实现。
- 异步操作:Agent通常需要同时处理多个任务,异常组(ExceptionGroup)可以帮助Agent优雅地处理并发任务中的多个失败情况。
初学者易错点
- 过于宽泛地捕获异常:使用
except Exception:会捕获几乎所有异常,包括程序应该终止的系统异常,这可能导致隐藏严重问题。 - 忽略finally子句中的return语句:如果在finally子句中使用return,它会覆盖try子句中的return值,这可能导致意外的行为。
- 不清理资源:没有使用with语句或finally子句来确保文件、网络连接等资源被正确释放。
- 异常链使用不当:在转换异常时,没有使用
raise ... from ...来保留原始异常信息,导致调试困难。 - 忽略异常的上下文信息:只捕获异常而不记录或提供足够的上下文信息,使得错误难以诊断和修复。
相关词条
tutorial-modulesPython模块系统,异常通常定义在模块中tutorial-classes类与对象,自定义异常通常基于类定义tutorial-context-managers上下文管理器,与异常处理和资源管理密切相关tutorial-concurrency并发编程,在异步和并发环境中异常处理更为复杂tutorial-io输入输出,文件操作经常需要异常处理tutorial-commandline命令行程序,需要优雅地处理用户输入错误