Переопределить сообщение об исключении Python - PullRequest
0 голосов
/ 06 марта 2019

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

Тривиальный пример:

>>> i = 1 / 0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero

И оно четко печатает сообщение division by zero.Предположим, у меня есть функция get_hostname(), которая сообщает мне мой публичный IP-адрес.Я хочу, чтобы это теперь вывело division by zero | 11.22.33.44.Опять же, я не хочу оборачивать ошибочную строку в try / catch, я хочу изменить функциональность самого этого исключения.

Как я могу это сделать?

1 Ответ

0 голосов
/ 06 марта 2019

Не знаю, как работает ваша функция, но вы делите something на divisor:

Я бы определенно попытался отловить исключение или использовать оператор if, если вы знаете, что divisor может бытьноль:

def get_hostname():
    divisor = 0
    something = 1
    if divisor == 0:
        raise ZeroDivisionError('division by zero | 11.22.33.44')
    return something / divisor

Другой вариант - использовать декоратор:

from functools import wraps

def extra_info(ip):
    def dec(f):
        def _decorator(*args, **kwargs):
            try:
                ans = f(*args, **kwargs)
            except ZeroDivisionError:
                raise ZeroDivisionError('division by zero | {}'.format(ip))
            return ans
        return wraps(f)(_decorator)
    return dec


@extra_info('11.22.33.44')
def get_hostname():
    divisor = 0
    something = 1
    return something / divisor
...