我只想打印异常类型和消息。
我最初尝试过:
try:
raise Exception("duh!!!")
except Exception as err:
print(err)但这只是打印异常消息。
duh!!!然后我翻阅了整个 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异常,它包含几行(打印时)显示语法错误发生位置的详细信息。指示发生哪个异常的消息是列表中的最后一个字符串。
因此,我了解到doc说它是一个列表,这就是为什么输出[...]中有一个列表。另外,doc说每一行都以换行符结尾,这就是为什么输出中有\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()如何为其增加更多的价值呢?
发布于 2021-06-21 01:17:46
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,或者将来出现的任何其他边缘情况,那么现在就需要维护代码了。
减少维护和增加可读性(因为每个人都知道库代码是干什么的)是使用标准库代码的两个相对普遍的优点。
https://stackoverflow.com/questions/52444076
复制相似问题