Как изменить сообщение об ошибке для всех исключений в Python? - PullRequest
0 голосов
/ 29 февраля 2020

Я хочу добавить предложение к каждому сообщению об ошибке, которое поднимает моя Python программа. Примерно так:

Traceback (most recent call last):
  File "test.py", line 1, in <module>
    raise Exception
  Exception
AN ERROR OCCURRED, PLEASE ASK ABOUT IT ON STACKOVERFLOW!

Я имею в виду все исключения, в том числе и встроенные. Как я могу это сделать?

1 Ответ

2 голосов
/ 29 февраля 2020

Я не уверен, возможно ли элегантно изменить все сообщения об исключениях.

Вот следующая лучшая вещь, которую я мог бы придумать. Мы собираемся использовать декораторы.

В общем, декораторы - это как обертки для функций. Вот хорошее объяснение того, как они работают здесь: https://youtu.be/7lmCu8wz8ro?t=2720

Это то, что я придумал:

def except_message(message=''):
  def inner(f):
    def wrapper(*args, **kwargs):
      try:
        return f(*args, **kwargs)
      except Exception as e:
        raise type(e)(str(e) + "\n" + message).with_traceback(sys.exc_info()[2])
    return wrapper
  return inner

Поверх функции, которую вы хотите чтобы использовать этот декоратор, напишите @except_message(message='My_message'), где 'My_message' - это то, что вы хотите, чтобы сообщение было. (Он добавит его в конец сообщения об исключении)

Пример:

@except_message(message='FOUND AN EXCEPTION')
def foo():
    raise Exception()

После запуска консоль возвращает следующее:

Traceback (most recent call last):
  File "main.py", line 7, in wrapper
    return f(*args, **kwargs)
  File "main.py", line 15, in foo
    raise Exception()
Exception

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "main.py", line 17, in <module>
    foo()
  File "main.py", line 9, in wrapper
    raise type(e)(str(e) + "\n" + message).with_traceback(sys.exc_info()[2])
  File "main.py", line 7, in wrapper
    return f(*args, **kwargs)
  File "main.py", line 15, in foo
    raise Exception()
Exception:
FOUND AN EXCEPTION

Если вы хотите, чтобы появилось только выбранное вами сообщение, измените функцию декоратора с str(e) + "\n" + message на message.

Также, чтобы изменить все исключения для этого сообщения, вы можете заключить код в функцию (либо вызывая его внутри функции в другом файле, либо просто изменяя отступ), а затем используя декоратор.

Кредиты:

{ ссылка }

{ ссылка }

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