Поиск по блогу

воскресенье, 30 ноября 2014 г.

Как вывести в лог описания ошибок успешно перехваченных в "exceptions"?

Например, у меня выскакивала ошибка, я ее перехватил, но теперь в сообщениях консоли вместо имени модуля..., номера строки, имени переменной... только мои записи о перехвате, ... теперь, чтобы вытащить информацию об ошибке надо использовать методы из библиотеки traceback.

Если раньше интерпретатор подсказывал мне, то после перехвата он пишет только то, что я написал сам

In []:
2014-11-29 16:48:58+0300 [scrapy] ERROR: ...does not exist 'req_url1' in c1=item['req_url1']
In []:
# Стала появляться длиннющая строчка:
2014-11-29 16:48:58+0300 [scrapy] INFO: Catch KeyError: from c[1-16] Probably, you switch off some pipe? 
                Or comment c[...]  in pipe_file.py

# В результате работы вот этого кода
except KeyError:
            log.msg('Catch KeyError: %s  in pipe_to_csvfile.py'% \
                    'from c[1-16] Probably, you switch off some pipe? \
Or comment c[...]')

Естественно, хочется не терять эту подробную информацию, полезно знать, что перехватил

In []:
#If you really wanted to catch all the errors, you can do the following:
import sys, traceback

def catchEverything():
    try:
        ... some operation(s) ...
    except:
        exc_type, exc_value, exc_traceback = sys.exc_info()
        ... exception handling ...

Пробуем сразу сконструировать свой вариант (с учетом материалов до конца поста)

In []:
mport sys, traceback
...
...
def .... :
    ...
    try:
        ... some operation(s) ...
    except:
        exc_type, exc_value, exc_traceback = sys.exc_info()
        traceback.print_exception(exc_type, exc_value, exc_traceback,limit=2, file=sys.stdout)

Этот вариант работает, конкретный пример в следующем посте.

Разберем пример из 28.10.1. Traceback Examples

In [1]:
import sys, traceback

def lumberjack():
    bright_side_of_death()

def bright_side_of_death():
    return tuple()[0]

Здесь у нас стек из двух функций заканчивается вызовом неопределенного кортежа, вот, что выдает наш продвинутый IPython:

In [2]:
lumberjack()
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-2-3b3886ce1353> in <module>()
----> 1 lumberjack()

<ipython-input-1-c30f44f31313> in lumberjack()
      2 
      3 def lumberjack():
----> 4     bright_side_of_death()
      5 
      6 def bright_side_of_death():

<ipython-input-1-c30f44f31313> in bright_side_of_death()
      5 
      6 def bright_side_of_death():
----> 7     return tuple()[0]

IndexError: tuple index out of range

Далее продолжим копировать код из примера, выполним его ... и получим подробный вывод

In [3]:
try:
    lumberjack()
except IndexError:
    exc_type, exc_value, exc_traceback = sys.exc_info()
    print "*** print_tb:"
    traceback.print_tb(exc_traceback, limit=1, file=sys.stdout)
    print "*** print_exception:"
    traceback.print_exception(exc_type, exc_value, exc_traceback,limit=2, file=sys.stdout)
    print "*** print_exc:"
    traceback.print_exc()
    print "*** format_exc, first and last line:"
    formatted_lines = traceback.format_exc().splitlines()
    print formatted_lines[0]
    print formatted_lines[-1]
    print "*** format_exception:"
    print repr(traceback.format_exception(exc_type, exc_value,exc_traceback))
    print "*** extract_tb:"
    print repr(traceback.extract_tb(exc_traceback))
    print "*** format_tb:"
    print repr(traceback.format_tb(exc_traceback))
    print "*** tb_lineno:", exc_traceback.tb_lineno
*** print_tb:
  File "<ipython-input-3-86e10621245a>", line 2, in <module>
    lumberjack()
*** print_exception:
Traceback (most recent call last):
  File "<ipython-input-3-86e10621245a>", line 2, in <module>
    lumberjack()
  File "<ipython-input-1-c30f44f31313>", line 4, in lumberjack
    bright_side_of_death()
IndexError: tuple index out of range
*** print_exc:
*** format_exc, first and last line:
Traceback (most recent call last):
IndexError: tuple index out of range
*** format_exception:
['Traceback (most recent call last):\n', u'  File "<ipython-input-3-86e10621245a>", line 2, in <module>\n    lumberjack()\n', u'  File "<ipython-input-1-c30f44f31313>", line 4, in lumberjack\n    bright_side_of_death()\n', u'  File "<ipython-input-1-c30f44f31313>", line 7, in bright_side_of_death\n    return tuple()[0]\n', 'IndexError: tuple index out of range\n']
*** extract_tb:
[('<ipython-input-3-86e10621245a>', 2, '<module>', u'lumberjack()'), ('<ipython-input-1-c30f44f31313>', 4, 'lumberjack', u'bright_side_of_death()'), ('<ipython-input-1-c30f44f31313>', 7, 'bright_side_of_death', u'return tuple()[0]')]
*** format_tb:
[u'  File "<ipython-input-3-86e10621245a>", line 2, in <module>\n    lumberjack()\n', u'  File "<ipython-input-1-c30f44f31313>", line 4, in lumberjack\n    bright_side_of_death()\n', u'  File "<ipython-input-1-c30f44f31313>", line 7, in bright_side_of_death\n    return tuple()[0]\n']
*** tb_lineno: 2

Traceback (most recent call last):
  File "<ipython-input-3-86e10621245a>", line 2, in <module>
    lumberjack()
  File "<ipython-input-1-c30f44f31313>", line 4, in lumberjack
    bright_side_of_death()
  File "<ipython-input-1-c30f44f31313>", line 7, in bright_side_of_death
    return tuple()[0]
IndexError: tuple index out of range

Далее я было решил поэкспериментировать с методами и параметрами traceback, но распечатал здесь только стек notebook

In [4]:
sys.exc_info()
Out[4]:
(None, None, None)
In [5]:
traceback.print_stack()
  File "<string>", line 1, in <module>
  File "C:\Users\kiss\Anaconda\lib\site-packages\IPython\kernel\zmq\kernelapp.py", line 469, in main
    app.start()
  File "C:\Users\kiss\Anaconda\lib\site-packages\IPython\kernel\zmq\kernelapp.py", line 459, in start
    ioloop.IOLoop.instance().start()
  File "C:\Users\kiss\Anaconda\lib\site-packages\zmq\eventloop\ioloop.py", line 151, in start
    super(ZMQIOLoop, self).start()
  File "C:\Users\kiss\Anaconda\lib\site-packages\tornado\ioloop.py", line 837, in start
    handler_func(fd_obj, events)
  File "C:\Users\kiss\Anaconda\lib\site-packages\tornado\stack_context.py", line 275, in null_wrapper
    return fn(*args, **kwargs)
  File "C:\Users\kiss\Anaconda\lib\site-packages\zmq\eventloop\zmqstream.py", line 433, in _handle_events
    self._handle_recv()
  File "C:\Users\kiss\Anaconda\lib\site-packages\zmq\eventloop\zmqstream.py", line 465, in _handle_recv
    self._run_callback(callback, msg)
  File "C:\Users\kiss\Anaconda\lib\site-packages\zmq\eventloop\zmqstream.py", line 407, in _run_callback
    callback(*args, **kwargs)
  File "C:\Users\kiss\Anaconda\lib\site-packages\tornado\stack_context.py", line 275, in null_wrapper
    return fn(*args, **kwargs)
  File "C:\Users\kiss\Anaconda\lib\site-packages\IPython\kernel\zmq\ipkernel.py", line 281, in dispatcher
    return self.dispatch_shell(stream, msg)
  File "C:\Users\kiss\Anaconda\lib\site-packages\IPython\kernel\zmq\ipkernel.py", line 245, in dispatch_shell
    handler(stream, idents, msg)
  File "C:\Users\kiss\Anaconda\lib\site-packages\IPython\kernel\zmq\ipkernel.py", line 389, in execute_request
    shell.run_cell(code, store_history=store_history, silent=silent)
  File "C:\Users\kiss\Anaconda\lib\site-packages\IPython\core\interactiveshell.py", line 2741, in run_cell
    interactivity=interactivity, compiler=compiler)
  File "C:\Users\kiss\Anaconda\lib\site-packages\IPython\core\interactiveshell.py", line 2833, in run_ast_nodes
    if self.run_code(code):
  File "C:\Users\kiss\Anaconda\lib\site-packages\IPython\core\interactiveshell.py", line 2883, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-5-e4a4d877ed6a>", line 1, in <module>
    traceback.print_stack()

Действитеьно, принципиальные вещи ясны, а экспериментировать лучше с конкретным пауком. Результы экспериментов в следующем посте.



Посты чуть ниже также могут вас заинтересовать

Комментариев нет:

Отправить комментарий