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

Python try catch中获取子文件内导入函数的精确报错行

如何在try-except中获取子模块的实际报错行号

当异常发生在导入的子模块中时,直接读取sys.exc_info()返回的初始traceback只能拿到主模块中调用函数的行号。要获取实际报错的子模块行号,需要遍历traceback的调用链,找到最底层的栈帧。

方法一:手动遍历traceback链

修改main.py的异常处理逻辑,循环获取tb_next直到链的末端,此时的栈帧就是异常实际抛出的位置:

from div import div
import sys

try: 
    print(div(5))
except Exception as e: 
    exception_type, exception_object, exception_traceback = sys.exc_info()
    # 遍历traceback链,定位到实际报错的栈帧
    while exception_traceback.tb_next:
        exception_traceback = exception_traceback.tb_next
    filename = exception_traceback.tb_frame.f_code.co_filename
    line_number = exception_traceback.tb_lineno

    print("Exception type: ", exception_type)
    print("File name: ", filename)
    print("Line number: ", line_number)  # 现在返回div.py的第2行
    print("Error: ", e)

方法二:使用traceback模块简化操作

Python的traceback模块提供了更简洁的工具函数,extract_tb可以直接提取所有栈帧信息,取最后一个元素就是实际报错的位置:

from div import div
import traceback

try: 
    print(div(5))
except Exception as e: 
    # 获取所有栈帧信息,取最后一个对应实际报错点
    tb_info = traceback.extract_tb(e.__traceback__)[-1]
    filename = tb_info.filename
    line_number = tb_info.lineno

    print("Exception type: ", type(e).__name__)
    print("File name: ", filename)
    print("Line number: ", line_number)  # 返回div.py的第2行
    print("Error: ", e)

原理说明

Python的异常traceback是一个链式结构:每一层tb_next对应调用栈的下一层(即被调用函数的执行上下文)。初始的exception_traceback指向主模块中触发异常的调用行,而遍历到链的末端时,就能定位到异常实际抛出的子模块代码行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 23:45:37