Я пытаюсь найти причину сбоя в наших скриптах python.Не удается найти источник исключения
Основная структура такова:
def main()
try:
dostuff
except Exception as ex:
import traceback
tb = traceback.format_exc()
import platform
node = platform.node()
sendMail([DEBUG_EMAIL], "Alarm exception on %s" % node, str(tb), [])
Я получаю StackTrace в нашей основной обработки ошибок, не в электронном сообщении об ошибке, которое я должен.
Traceback (most recent call last):
File "/usr/lib/python2.6/logging/__init__.py", line 799, in emit
stream.write(fs % msg.encode("UTF-8"))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 66: ordinal not in range(128)
Из того, что я вижу все записи-звонки в регистраторе находятся внутри примерки блока, но так как это не перехватываются и обрабатываются в моей электронной почте посылающего блок исключений, кажется, я что-то пропустил. Я проверил, и функция sendMail вообще не использует модуль регистрации. Поэтому исключение не должно происходить в моем исключающем блоке.
Я попытался добавить
sys.tracebacklimit = 10
в верхней части файла увидеть, где исключение происходит, но это ничего не влияет. И теперь у меня нет идей о том, как найти причину возникновения проблемы.
Сценарий запускается один раз в час и только один раз падает в неделю, что заставляет меня предположить, что это связано с входными данными, но это обрабатывается только dostuff().
UPDATE:
Я понял, почему я получаю только одну строку StackTrace. Внутри emit() я нашел это.
try:
... doing stuff, something goes boom with encoding...
except UnicodeError:
stream.write(fs % msg.encode("UTF-8")) Here it goes Boom again
self.flush()
except (KeyboardInterrupt, SystemExit):
raise
except:
self.handleError(record) Which means it ends up here
И соответствующая часть функции HandleError выглядит следующим образом:
ei = sys.exc_info()
try:
traceback.print_exception(ei[0], ei[1], ei[2], None, sys.stderr)
Что только печатает последнюю часть StackTrace.
Я не уверен, что вы имеете в виду. – dutt
Исключение похоже на скрипт '__init __. Py' пакета регистрации, так что это может произойти и при загрузке скрипта, и невозможен импорт' logging', прежде чем вы введете блок try – val
@ValentinCLEMENT Добавлена информация об использовании и частота аварий. – dutt