Python отображать настраиваемое сообщение об ошибке / трассировку для каждого исключения - PullRequest
0 голосов
/ 14 июля 2020

Поддерживает ли Python способ отображения одного и того же пользовательского сообщения об ошибке для каждого исключения / повышения / утверждения (независимо от того, где произошел сбой кода)?

Моя текущая трещина в ней использует декоратор. У меня есть функция main, и она отлично отображает трассировку, но я хочу, чтобы она также печатала my_var (который находится ВНУТРИ области действия функции) каждый раз, когда возникает ЛЮБАЯ ошибка. Итак, очевидно, что здесь есть проблема с масштабом - это просто для иллюстрации того, что я хочу сделать. Любые идеи приветствуются.

import traceback

def exit_with_traceback(func, *args, **kwargs):
    def wrap(*args, **kwargs):
        try:
            return func(*args, **kwargs)
        except:
            # how do I get this to print my_var AND the traceback?
            print(traceback.format_exc())
    return wrap
        
@exit_with_traceback
def main(bar=1):
    my_var = 'hello world'  # variable specific to main()
    return bar + 1

main(bar=None)  # run main() to throw the exception

1 Ответ

1 голос
/ 21 июля 2020

Вы можете попытаться переопределить функцию excepthook в модуле sys. Из документации:

Когда возникает и не перехвачено исключение, интерпретатор вызывает sys.excepthook с тремя аргументами: классом исключения, экземпляром исключения и объектом трассировки.

Таким образом, код может выглядеть примерно так (я использовал ваш пример):

import sys


# define custom exception hook
def custom_exception_hook(exc_type, value, traceback):
    print('Custom exception hook')
    print('Type:', exc_type)
    print('Value:', value)
    print('Traceback:', traceback)
    lc = traceback.tb_next.tb_frame.f_locals
    print(lc.get('my_var'))  # this prints "hello world"


# override the default exception hook
sys.excepthook = custom_exception_hook


def main(bar=1):
    my_var = 'hello world'  # variable specific to main()
    return bar + 1


main(bar=None)  # run main() to throw the exception

Переопределение sys.excepthook не работает в IDLE, но отлично работает из командной строки. Надеюсь, это будет полезно.

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