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

如何让Python异常回溯仅显示自定义脚本文件的引用?

如何让Python回溯只显示自身脚本的文件引用?

当然可以实现,通过自定义异常处理逻辑过滤回溯栈即可,以下是两种实用方法:

方法一:全局替换异常钩子(推荐)

通过修改sys.excepthook,让所有未捕获的异常都自动过滤掉核心/第三方库的回溯帧:

import sys
import traceback
import os

# 替换为你的脚本根目录(当前脚本所在文件夹)
MY_SCRIPT_ROOT = os.path.abspath(os.path.dirname(__file__))

def filtered_excepthook(exc_type, exc_value, exc_traceback):
    # 提取回溯帧并过滤
    filtered_frames = []
    for frame in traceback.extract_tb(exc_traceback):
        frame_path = os.path.abspath(frame.filename)
        # 只保留脚本根目录下的文件
        if frame_path.startswith(MY_SCRIPT_ROOT):
            filtered_frames.append(frame)
    
    # 打印过滤后的回溯信息
    print("Traceback (仅显示自身脚本):")
    traceback.print_list(filtered_frames)
    print(f"{exc_type.__name__}: {exc_value}")

# 应用自定义钩子
sys.excepthook = filtered_excepthook

方法二:局部捕获并过滤异常

如果只想针对特定代码块处理,可以在try-except中手动过滤回溯:

import sys
import traceback
import os

MY_SCRIPT_ROOT = os.path.abspath(os.path.dirname(__file__))

try:
    # 这里写你的业务代码
    raise RuntimeError("测试异常")
except Exception as e:
    # 提取并过滤回溯帧
    tb_frames = traceback.extract_tb(sys.exc_info()[2])
    filtered_frames = [f for f in tb_frames if os.path.abspath(f.filename).startswith(MY_SCRIPT_ROOT)]
    
    # 输出结果
    print("过滤后的回溯:")
    traceback.print_list(filtered_frames)
    print(f"{type(e).__name__}: {e}")

注意事项

  • MY_SCRIPT_ROOT必须是绝对路径,避免因工作目录变化导致过滤失效
  • 同目录下的子模块、脚本文件的回溯帧会被保留,符合需求
  • 该逻辑仅过滤输出内容,不会改变异常本身的处理流程

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 14:03:32