我有一个函数放在except
的{{1}}部分内,我希望它能记录错误信息。问题是我无法获得产生错误的代码行,因为我之前可以做到。看看这段代码:
try
这是日志功能:
def func():
try:
a = 1
b = 0
print a / b
except:
Debug.log()
执行后我可以看到该行为空:
def log(cls):
try:
exc_type, exc_obj, tb = sys.exc_info()
f = tb.tb_frame
line_no = str(tb.tb_lineno)
filename = f.f_code.co_filename
linecache.checkcache(filename)
line = linecache.getline(filename, line_no, f.f_globals)
current_frame = inspect.currentframe()
previous_frame = current_frame.f_back
func_name = previous_frame.f_code.co_name
msg = str(exc_obj)
obj = Error()
obj.filename = filename
obj.line_no = line_no
obj.line = line
obj.msg = msg
obj.function = func_name
obj.save()
怎么了?
答案 0 :(得分:4)
代码正在将str
对象传递给linecache.getline
。
line_no = str(tb.tb_lineno)
^^^
根据linecache.py
source code,将传递的行号与1和行总数进行比较:
if 1 <= lineno <= len(lines):
return lines[lineno-1]
else:
return ''
因为lineno
是str
对象,所以谓词在Python 2.x中被评估为False
(在Python 3.x中引发异常,因为str
之间的比较并且int
是不允许的)
>>> 1 < '2' < 3
False
你得到一个空字符串。
您应该传递int
个对象。
line = linecache.getline(filename, int(line_no))
或
line = linecache.getline(filename, tb.tb_lineno)