linecache.getline()什么都不返回

时间:2014-09-13 05:46:00

标签: python python-2.7

我有一个函数放在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()

怎么了?

1 个答案:

答案 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 ''

因为linenostr对象,所以谓词在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)
相关问题