假设我有一个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
具体来说,我想获取异常消息-相当于Python 2.6中的e.message
或Python 2.7中的str(e)
。
我尝试过
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
(来自related question)几乎可以做正确的事情(处理字节和unicode),但是它迫使我在:
上拆分。 format_exception_only
在python2中返回一个字节字符串,在python3中返回一个Unicode字符串也无济于事。
# 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
,但感觉应该有更好的方法。