我只想打印异常类型和消息。
我最初尝试过:
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_type
和sys.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()
如何为此增加更多价值呢?
答案 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,或者将来出现任何其他边缘情况,您现在需要维护代码。
>减少维护和增加可读性(因为每个人都知道库代码的作用)是使用标准库代码的两个相对普遍的优势。