2014-09-13 7 views
1

У меня есть функция поместить внутри except часть try, и я хочу, чтобы она регистрировала информацию об ошибке. Проблема в том, что я не могу получить строку кода, которая вызвала ошибку, как я мог это сделать раньше. Взгляните на этот код:linecache.getline() ничего не возвращает

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() 

После выполнения я могу видеть, строка пустая:

{ 
    "_id" : ObjectId("5413d67a65765f16219aa575"), 
    "filename" : "E:/Developer Center/DomainServices/DomainServices/test.py", 
    "line_no" : "23", 
    "line" : "", 
    "msg" : "integer division or modulo by zero", 
    "function" : "func", 
} 

Что случилось?

ответ

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 объект, основывается оценивается как False в Python 2.x (возбудит исключение в Python 3.x, потому что сравнение между str и int не допускается)

>>> 1 < '2' < 3 
False 

Вы получаете пустую строку.


Необходимо передать объект int.

line = linecache.getline(filename, int(line_no)) 

или

line = linecache.getline(filename, tb.tb_lineno) 
Смежные вопросы