了解`traceback.format_exception_only()`

时间:2018-09-21 12:43:21

标签: python exception exception-handling

我只想打印异常类型和消息。

我最初尝试过:

try:
    raise Exception("duh!!!")
except Exception as err:
    print(err)

但这只是打印的异常消息。

 duh!!!

然后我遍历了整个traceback doc,觉得traceback.format_exception_only()是我要找的那个。

所以我尝试如下:

try:
    raise Exception("duh!!!")
except:
    etype, evalue, tb = sys.exc_info()
    print(traceback.format_exception_only(etype, evalue)))

它打印如下:

['Exception: duh!!!\n']

这对我来说有点出乎意料。因此,我重新阅读了此方法的文档。它说:

  

格式化回溯的异常部分。参数是异常类型和值,例如sys.last_typesys.last_value给出的值。返回值是一个字符串列表,每个字符串都以换行符结尾。通常,列表只包含一个字符串。但是,对于SyntaxError例外,它包含几行(在打印时)显示有关语法错误发生位置的详细信息。指示发生哪个异常的消息是列表中总是最后一个字符串。

因此,我知道该文档说了一个列表,这就是为什么在输出[...]中有一个列表的原因。此外,文档还说每一行都以换行符结尾,这就是为什么输出中有\n的原因。但是如果SyntaxError出现多行,我不知道吗?我无法产生SyntaxError,这将导致format_exception_only()的返回值出现多行。

也突然让我觉得我可以做

try:
    raise Exception("duh!!!")
except:
    etype, evalue, tb = sys.exc_info()
    print('{}: {}'.format(etype.__name__, evalue))

获取

Exception: duh!!!

但是format_exception_only()如何为此增加更多价值呢?

1 个答案:

答案 0 :(得分:0)

Python 是开源的,因此您可以查看实现并决定自己的额外价值:

    if self.exc_type is None:
        yield _format_final_exc_line(None, self._str)
        return

    stype = self.exc_type.__qualname__
    smod = self.exc_type.__module__
    if smod not in ("__main__", "builtins"):
        stype = smod + '.' + stype

    if not issubclass(self.exc_type, SyntaxError):
        yield _format_final_exc_line(stype, self._str)
    else:
        yield from self._format_syntax_error(stype)

这是一个相当简单的功能,所以是的,根据您的问题,如果您忽略不使用的功能部分,它不会为您增加太多价值。

当然,如果将来有任何异常更改,或者如果异常引发器开始返回 SyntaxErrors,或者将来出现任何其他边缘情况,您现在需要维护代码。

>

减少维护和增加可读性(因为每个人都知道库代码的作用)是使用标准库代码的两个相对普遍的优势。