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
相关产品推荐
相关产品推荐

