Как правильно отформатировать сообщение об исключении Python, совместимое с Python2 и Python3? - PullRequest
0 голосов
/ 03 сентября 2018

Предположим, у меня есть исключение e, и я хотел бы отформатировать его для регистрации / печати:

def format_exception(e):
    # type: (Exception) -> Text
    """Log formatter used in a catch-all near the edge."""
    return str(e)  # Python 2.7 only

В частности, я хочу получить сообщение об исключении - эквивалент e.message в Python 2.6 или str(e) в Python 2.7.

Я пытался

return six_text_type(e)

Однако это не работает, если e.message содержит закодированные байты (что, учитывая то, что я работаю в среде py2-py3, может произойти).

>>> six.text_type(MyError(u'?'))   # OK
>>> six.text_type(MyError(u'?'.encode('utf-8')))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xf0 in position 0: ordinal not in range(128)

traceback.format_exception_only (из соответствующего вопроса ) делает почти правильные вещи (обрабатывает как байты, так и юникод), но заставляет меня разделиться на :. Также не помогает то, что format_exception_only возвращает байтовую строку в python2 и строку в кодировке Unicode в python3.

# python2
>>> type(traceback.format_exception_only(type(e), e)[0])
str
# python3
>>> type(traceback.format_exception_only(type(e), e)[0])
str

Так что это не совсем работает. Свернуть это в six.text_type снова не удастся, если e.message содержит закодированные байты.

Как правильно заполнить format_exception? Мне действительно нужно использовать traceback2?

def format_exception(e):
    # type: (Exception) -> Text
    return traceback2.format_exception_only(type(e), e)[0].split(': ')[1]

Я могу установить и использовать traceback2, но такое чувство, что должен быть лучший способ.

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