#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 Я бы с удовольствием, но это довольно старый пост, и у меня сейчас нет кода. Ответит, если я его получу. Извините, здесь не смог помочь.