python如何处理捕获的异常

Python异常处理需按类型精细捕获、有针对性地恢复或反馈,避免裸except;应提供默认值、清理资源、记录日志、包装重抛、友好提示,并善用else和finally。

Python 中捕获异常后,关键不是“抓到就算完”,而是要根据异常类型、业务逻辑和用户体验,做有针对性的处理。核心原则是:能恢复就恢复,不能恢复就明确反馈,必要时记录或转抛。

判断是否需要真正处理(而不是简单忽略)

很多新手习惯写 except: 然后 pass,这极容易掩盖真实问题。应优先考虑:

  • 这个异常是不是预期中可能发生的?比如网络请求超时、文件不存在、用户输入格式错误
  • 当前层级有没有能力修复或兜底?例如读配置失败时,能否切到默认值
  • 忽略它会不会导致后续逻辑出错或数据不一致

按类型精细捕获,避免宽泛 except

用具体异常类替代裸 except:,便于区分处理逻辑:

try:
    data = json.loads(user_input)
except json.JSONDecodeError as e:
    print(f"JSON 格式错误:{e}")
    data = {}
except TypeError:
    print("输入不是字符串,无法解析")
    data = {}

这样比 except Exception: 更安全,也更容易调试。

在 except 中做有意义的事

常见合理操作包括:

  • 提供默认值或备用路径:如 open 失败时用内置默认配置
  • 清理资源:关闭已打开的文件、断开临时连接(推荐用 finally 或上下文管理器更稳妥)
  • 记录日志:用 logging.exception() 记下完整 traceback
  • 转换并重新抛出:把底层异常包装成更业务友好的异常,例如 raise ConfigLoadError("配置加载失败") from e
  • 给用户友好提示:CLI 中提示“请检查文件路径”,Web 中返回 400 响应

善用 else 和 finally 补充逻辑

else 块在没异常时执行,适合放“成功路径”的代码,避免误捕正常流程中的异常;finally 一定执行,适合清理:

f = None
try:
    f = open("data.txt")
    content = f.read()
except FileNotFoundError:
    print("文件不存在,使用空数据")
    content = ""
else:
    print("文件读取成功")
finally:
    if f and not f.closed:
        f.close()  # 确保关闭

基本上就这些。异常处理不是越复杂越好,关键是让程序更健壮、错误更可查、用户更清楚发生了什么。