格式化与Python2和Python3兼容的python异常消息的正确方法是什么?

时间:2018-09-03 04:54:22

标签: python python-3.x python-2.7 error-handling exception-handling

假设我有一个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,但感觉应该有更好的方法。

0 个答案:

没有答案