我正在开发一个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