有没有办法在Python 3中接收更多视觉上令人愉悦的 traceback 消息(我使用命令行)?至少,我希望每个电话都用一个空行隔开。
答案 0 :(得分:0)
您始终可以通过sys.excepthook
定义自己的默认异常处理程序,并决定如何打印回溯。例如,如果您只想在回溯线之间添加一条额外的新线,您只需要:
import sys
import traceback
def custom_traceback(exc, val, tb):
print("\n".join(traceback.format_exception(exc, val, tb)), file=sys.stderr)
sys.excepthook = custom_traceback
然后,如果您执行以下操作:
>>> 1/0
你会得到:
Traceback (most recent call last):
File "<input>", line 1, in <module>
ZeroDivisionError: division by zero
而不是通常整齐的输出,条目之间有一个新的行。当然,您可以修改custom_traceback
以打印您想要的数据,只需确保在代码中尽早执行它 - 在设置异常挂钩之前,它将使用默认的回溯打印。
答案 1 :(得分:0)
@KhoaVõĐăng,首先,我感谢您的提问。 Python的追溯模块是一个正确的选择(因为 @zwer 也在评论中提出)。
Python的追溯文档链接:https://docs.python.org/3.6/library/traceback.html
我在这里提出了2个代码。
第一个显示了Python的默认回溯(你已经熟悉了这个并且不希望这个回溯)。
第二个显示附加了2张图片的自定义回溯。第一张图片以\n
作为分隔符&amp;第二张图片显示---------------------------
作为分隔符。
在线试用»
以
\n
作为separtor(这是您想要的) - http://rextester.com/QHIPTT48766将
--------------
字符串作为分隔符(我将其添加到测试中) - http://rextester.com/GVVK50237
def func3(a):
a/0;
def func2(a, b):
func3(a);
def func1(a, b, c):
func2(a, b);
if __name__ == "__main__":
func1(12, 0, 89)
import sys, traceback
def func3(a):
a/0;
def func2(a, b):
func3(a);
def func1(a, b, c):
func2(a, b);
if __name__ == "__main__":
try:
func1(12, 0, 89)
except:
exc_type, exc_value, exc_traceback = sys.exc_info()
# exc_type below is ignored on 3.5 and later
exception_messages = traceback.format_exception(exc_type, exc_value,
exc_traceback)
for exception_message in exception_messages:
print(exception_message)
更改上述代码中的for循环,如下所示:
for exception_message in exception_messages:
print("-----------------------------------------------------------------------")
print(exception_message)