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

