在try catch中获取准确的错误行(子文件中的错误行)



我正在开发一个python bot,当我使用try catch来处理异常时,调试很糟糕。

我需要得到正确的错误行,当错误发生在子文件中,我导入一个函数。下面是一个例子:

我的文件结构:

  • div.py
  • main.py

div.py:

def div(n):
return n / 0

main.py:

from div import div
import sys
try: 
print(div(5))
except Exception as e: 
exception_type, exception_object, exception_traceback = sys.exc_info()
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) # return line 5
print("Error: ", e)

我期望得到'print(" line number: ", line_number)'中的第2行,因为错误发生在div.py中的第2行,但返回第5行,在那里我调用函数。

我搜索如何在try catch中获得错误行,但我只找到这样的解决方案,在主文件中返回错误行,而不是在子文件中。

下面是一个提取最后一个堆栈帧的示例:

import traceback
from div import div
import sys
try: 
print(div(5))
except Exception as e:
exception_type, exception_object, exception_traceback = sys.exc_info()
last_frame = traceback.extract_tb(exception_traceback)[-1]
print("Exception type: ", exception_type.__name__)
print("File name: ", last_frame.filename)
print("Line number: ", last_frame.lineno)
print("Error: ", e)

输出:

Exception type:  ZeroDivisionError
File name:  C:Usersmetolonediv.py
Line number:  2
Error:  division by zero

你也可以按照你喜欢的方式走帧格式:

import traceback
from div import div
import sys
try: 
print(div(5))
except Exception as e:
exception_type, exception_object, exception_traceback = sys.exc_info()
tb = traceback.extract_tb(exception_traceback)
print("Exception type: ", exception_type.__name__)
print("Error: ", e)
for frame in tb:
print(f'File: {frame.filename}({frame.lineno}):n  {frame.line}')

输出:

Exception type:  ZeroDivisionError
Error:  division by zero
File: C:Usersmetolonetest.py(6):
print(div(5))
File: C:Usersmetolonediv.py(2):
return n / 0

相关内容

最新更新