J'Blog

8 课 · 入门

语义检索

基于 Chroma 向量库,与 Workspace 知识库分离。用自然语言描述你想查的内容。 非管理员每人每天可检索 5 次(消耗站点 AI 配额)。

异常处理

原文:异常处理

一句话

学习Python中错误和异常的处理机制,包括捕获、触发和自定义异常。

什么时候翻这页

  1. 当你的Agent需要处理外部API调用可能出现的错误时
  2. 当你需要设计健壮的工具调用机制,处理各种可能的异常情况
  3. 当你的Agent需要向用户提供有意义的错误信息时
  4. 当你需要在异步操作中正确处理异常时

核心概念

  1. 语法错误:代码结构不符合Python语法规则,在解析阶段就会被检测到
  2. 异常:程序运行时检测到的错误,如果不处理会导致程序终止
  3. try-except语句:捕获和处理异常的基本结构
  4. finally子句:无论是否发生异常都会执行的清理代码
  5. 异常链:一个异常是由另一个异常引起的,可以使用raise ... from ...语法
  6. 自定义异常:创建自己的异常类,通常继承自Exception类
  7. 异常组(ExceptionGroup):用于同时处理多个相关异常
  8. 异常注释:使用add_note()方法为异常添加额外信息

怎么做

  1. 基本异常处理
try:
    # 可能引发异常的代码
    x = int(input("请输入一个数字: "))
    result = 10 / x
except ValueError:
    print("输入的不是有效的数字")
except ZeroDivisionError:
    print("不能除以零")
else:
    print(f"结果是: {result}")
finally:
    print("执行完毕")
  1. 捕获多个异常
try:
    # 可能引发多种异常的代码
    risky_operation()
except (ValueError, TypeError) as e:
    print(f"数值错误: {e}")
except OSError as e:
    print(f"系统错误: {e}")
  1. 自定义异常
class MyCustomError(Exception):
    """自定义异常类"""
    pass

try:
    # 某些条件满足时引发自定义异常
    if condition:
        raise MyCustomError("发生了自定义错误")
except MyCustomError as e:
    print(f"捕获到自定义异常: {e}")
  1. 异常链
try:
    # 尝试打开文件
    f = open("important_file.txt")
    data = f.read()
except IOError as e:
    # 文件操作失败,引发更具体的异常
    raise RuntimeError("无法处理文件数据") from e
  1. 异常组
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 开发的联系

  1. Agent工具调用:当Agent调用外部API或工具时,必须处理可能出现的网络错误、超时、无效响应等异常,确保Agent不会因单一工具失败而完全停止工作。
  2. 结构化输出:Agent需要将捕获的异常转换为用户友好的消息,同时保留足够的技术细节用于调试,这可以通过自定义异常和异常注释实现。
  3. 异步操作:Agent通常需要同时处理多个任务,异常组(ExceptionGroup)可以帮助Agent优雅地处理并发任务中的多个失败情况。

初学者易错点

  1. 过于宽泛地捕获异常:使用except Exception:会捕获几乎所有异常,包括程序应该终止的系统异常,这可能导致隐藏严重问题。
  2. 忽略finally子句中的return语句:如果在finally子句中使用return,它会覆盖try子句中的return值,这可能导致意外的行为。
  3. 不清理资源:没有使用with语句或finally子句来确保文件、网络连接等资源被正确释放。
  4. 异常链使用不当:在转换异常时,没有使用raise ... from ...来保留原始异常信息,导致调试困难。
  5. 忽略异常的上下文信息:只捕获异常而不记录或提供足够的上下文信息,使得错误难以诊断和修复。

相关词条

  • tutorial-modules Python模块系统,异常通常定义在模块中
  • tutorial-classes 类与对象,自定义异常通常基于类定义
  • tutorial-context-managers 上下文管理器,与异常处理和资源管理密切相关
  • tutorial-concurrency 并发编程,在异步和并发环境中异常处理更为复杂
  • tutorial-io 输入输出,文件操作经常需要异常处理
  • tutorial-commandline 命令行程序,需要优雅地处理用户输入错误

官方原文:https://docs.python.org/zh-cn/3/tutorial/errors.html