Предположим, у меня есть исключение 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
, но такое чувство, что должен быть лучший способ.