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

Python中如何用except打印函数内错误的实际行号及回溯信息?

问题:捕获错误实际发生的行号并打印友好错误信息

我用linecache写了一段错误捕获代码,但只能获取到func()调用处的行号,无法定位到错误实际发生的行:

import linecache

def func():
    if xx == 1:
        print('ok')

try:
    func()
except:
    exc_type, exc_obj, tb = sys.exc_info()
    f = tb.tb_frame
    lineno = tb.tb_lineno
    filename = f.f_code.co_filename
    linecache.checkcache(filename)
    line = linecache.getline(filename, lineno, f.f_globals)
    print_('ERROR - (LINE {} "{}"): {}'.format(lineno, line.strip(), exc_obj))

输出结果:

ERROR - (LINE 8 ""): name 'xx' is not defined

我希望能打印错误实际发生的行号(应为第4行),或者同时打印调用处和错误发生处的回溯信息,就像没有try-except时的默认报错那样:

File "<input>", line 5, in <module>
  File "<input>", line 2, in func
NameError: name 'xx' is not defined. Did you mean: 'xxx'?

解决方案

方案一:获取错误实际发生的行号

原来的代码只拿到了顶层栈帧(func()调用处),需要遍历回溯链到最内层栈帧,才能定位错误实际发生的位置:

import linecache
import sys

def func():
    if xx == 1:
        print('ok')

try:
    func()
except:
    exc_type, exc_obj, tb = sys.exc_info()
    # 遍历到最内层栈帧,找到错误实际发生的位置
    while tb.tb_next:
        tb = tb.tb_next
    f = tb.tb_frame
    lineno = tb.tb_lineno
    filename = f.f_code.co_filename
    linecache.checkcache(filename)
    line = linecache.getline(filename, lineno, f.f_globals)
    print(f'ERROR - (LINE {lineno} "{line.strip()}"): {exc_obj}')

输出结果:

ERROR - (LINE 4 "if xx == 1:"): name 'xx' is not defined

方案二:打印完整回溯信息(推荐)

直接使用Python内置的traceback模块,可以快速生成和默认报错一致的完整回溯信息,同时展示调用链和错误发生位置:

import traceback

def func():
    if xx == 1:
        print('ok')

try:
    func()
except:
    # 直接打印完整错误回溯
    traceback.print_exc()
    
    # 如果需要自定义格式,也可以先获取格式化字符串再处理
    # error_content = traceback.format_exc()
    # print("自定义错误信息:\n", error_content)

输出结果:

File "<input>", line 8, in <module>
  File "<input>", line 4, in func
NameError: name 'xx' is not defined. Did you mean: 'xxx'?

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 19:20:41