You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何捕获Python被调用函数抛出的异常?try-except不生效排查

问题排查与修复方案

语法上裸except:可以捕获所有常规运行时异常,你当前捕获失效基本是以下几个原因,对应修复即可:

核心问题点

  1. 你写的return Exception测试逻辑完全不会触发异常捕获:return只是把异常类作为普通返回值返回,只有执行raise语句才会真正抛出异常、触发except分支,这种写法函数属于正常执行完成,自然不会进异常处理逻辑。
  2. 如果写了raise Exception仍然捕获不到,基本是以下场景导致:
    • try块内的save_template根本没被执行:比如前置代码提前return、分支判断没走到当前调用逻辑、修改代码后未保存就运行、存在同名save_template函数覆盖了你写的抛异常版本
    • 如果用了多线程/多进程,子线程/子进程内抛出的异常无法被主线程的try-except捕获
  3. 代码规范问题:不建议抛空的基类Exception,也不建议用裸except捕获所有异常,会误抓其他意料之外的错误(比如权限不足、路径不存在的报错),导致问题被掩盖。

正确实现代码

首先优化文件保存函数,用Python内置的FileExistsError(专门对应文件已存在场景的标准异常),抛出时附带明确信息:

import os

def save_template(rendered_template, target_path, file_name):
    full_path = os.path.join(target_path, file_name)
    if os.path.exists(full_path):
        raise FileExistsError(f"Target file {full_path} already exists")
    # 建议指定文件编码,避免不同系统默认编码不一致导致乱码
    with open(full_path, "w", encoding="utf-8") as f:
        f.write(rendered_template)

然后修正调用方的捕获逻辑,明确捕获指定的文件存在异常,避免误抓其他错误:

def build_controller():
    # ... 其他前置业务代码
    target_file = os.path.join(path, file_name)
    try:
        save_template(rendered, path, file_name)
    except FileExistsError:
        echo(f"{target_file} already exists. Doing nothing.", "yellow")

额外排查技巧

如果改完还是捕获不到,可以在save_template里抛异常的位置加一行打印,确认代码真的走到了抛异常的分支,同时打印下当前调用的save_template的函数id,确认没有被其他同名函数覆盖。

内容的提问来源于stack exchange,提问作者Jason Strimpel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 07:12:34