Странное исключение с cgitb в python и inspect.py

#python #python-2.7

#python #python-2.7

Вопрос:

У меня есть функция, которая декодирует исключение и отправляет информацию в файл. В основном я делаю следующее:

 exc_info = sys.exc_info
txt = cgitb.text(exc_info)
  

Используя это, я получил следующую трассировку исключения:

 Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:Python27libsite-packagesjob_queueutilsstart_workers.py", line 40, in start_worker
  worker_loop(r_jq, worktype, worker_id)
File "C:Python27libsite-packagesjob_queueserverjq_worker.py", line 55, in worker_loop     
  _job_machine(*job)
File "C:Python27libsite-packagesjob_queueserverjq_worker.py", line 34, in _job_machine
  do_verbose_exception()
File "C:Python27libsite-packagesjob_queueservererrors.py", line 23, in do_verbose_exception
  txt = cgitb.text(exc_info)
File "C:Python27libcgitb.py", line 214, in text
  formatvalue=lambda value: '='   pydoc.text.repr(value))
File "C:Python27libinspect.py", line 885, in formatargvalues
  specs.append(strseq(args[i], convert, join))
File "C:Python27libinspect.py", line 840, in strseq
  return convert(object)
File "C:Python27libinspect.py", line 882, in convert
  return formatarg(name)   formatvalue(locals[name])
KeyError: 'connection'
  

Я запускал код несколько раз после этого исключения, но не смог его воспроизвести. Однако я не нашел никаких ссылок в файлах cgitb.py или inspect.py либо к dict с ключом «connection».

Кто-нибудь знает, является ли это проблемой с cgitb python или файлами проверки? Какие-нибудь полезные данные?

Ответ №1:

Вы передали неправильный тип в текстовую функцию, как показано ниже, правильным способом.

cgitb.text((sys.last_type, sys.last_value, sys.last_traceback))

Ответ №2:

Я не уверен, почему именно происходит это исключение, но читали ли вы документы для модуля cgitb? Похоже, что начиная с python 2.2 он поддерживает запись исключений в файл: http://docs.python.org/library/cgitb.html

Вероятно, что-то вроде: cgitb.enable(0, «/my/log/directory») # или 1, если вы хотите увидеть это в браузере

Что касается вашей фактической трассировки, вы уверены, что «connection» — это не имя, которое вы используете в своем собственном коде? модуль ‘inspect’, скорее всего, пытается изучить ваш собственный код для создания информации о трассировке cgi и где-то получает неверный ключ?

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

1. Я перепроверил свою кодовую базу, и в моей кодовой базе нет объекта «connection». На самом деле, я запустил это после сбоя с тем же контекстом, и это было успешно. Если вы просматриваете журнал сбоев, в строке 882 отображается ‘locals [name]’, и это сбой из-за name -> connection . Все еще не понимаю, откуда это взялось.

2. Я просмотрел код cgitb. Даже использование cgitb.enable с именем каталога журнала не решит эту проблему — это произошло при попытке декодировать обратную трассировку, возвращаемую sys.exc_info , которая также будет использоваться там.

3. Хорошо, я думаю, что нашел проблему. Я использую MySQLdb, и возникшее исключение использовало ‘defaulthandler’ (файл: connections. py), где «соединение» удаляется после возникновения ошибки. Не знаю, почему это делается. Однако я мог бы обойти это, используя обработчик исключений вокруг ‘txt = cgitb.text (exc_info)’, где я использую ‘traceback.format_exception’. Спасибо за помощь.

4. @Ethan Не могли бы вы, пожалуйста, объяснить в качестве ответа, как вы решили проблему, в настоящее время, прочитав ваш ответ, я понял следующее: теперь у вас есть строка this txt в блоке try, и except улавливает исключение format_exception, но я не понимаю, как это решит проблему с ошибкой ключа подключения?

5. @MansoorAkram Я бы с удовольствием, но это довольно старый пост, и у меня сейчас нет кода. Ответит, если я его получу. Извините, здесь не смог помочь.