Правильный способ обработки трассировок стека исключений в Python

Я пишу некоторый код, который может генерировать исключения глубоко в стеке, и у меня есть уровень ближе к вершине, который перехватывает эти исключения и отправляет их для обработки модулем обработки ошибок. Я хотел бы, чтобы модуль обработки ошибок мог печатать трассировку стека в свой журнал ошибок, но мне трудно понять, как это сделать.

Некоторые примечания по фону:

  • Код многопоточный-, поэтому я не уверен в поведении sys.last_traceback

  • Я пытался захватить стек в конструкторе само исключение. sys.last_traceback иногда имеет значение None в этом случае (, так как он существует только в случае необработанных исключений)и не всегда корректен. В настоящее время я играю с использованием

    self.stack = traceback.format_stack()[:-2]

в конструкторе исключения, и хотя это выглядит многообещающе с точки зрения информации, это не кажется «правильным» способом сделать это

  • Все примеры того, как это сделать, которые мне удалось найти, показывают, как распечатать трассировку стека в блоке исключений, а не в каком-то более позднем модуле обработки ошибок, и это поведение отличается от того, что я хочу. (см., например, Печать текущего стека вызовов из метода в коде Python)

  • Я изучил модуль трассировки в документации по Python(http://docs.python.org/library/traceback.html)и не смог выяснить, является ли это даже делает то, что я хочу. Кажется, в основном это связано с форматированием трассировок, которые вы можете получить из sys.last_traceback. У него есть несколько примеров использования, и ни один из них не соответствует тому, что я пытаюсь сделать.

Не думаю, что я первый, кто захочет это сделать,так что я должен что-то упустить. Любые указатели в правильном направлении очень ценятся.

6
задан Community 23 May 2017 в 12:16
поделиться