在失败时获得更漂亮的回溯

时间:2018-06-08 13:03:53

标签: python-3.x command-line

有没有办法在Python 3中接​​收更多视觉上令人愉悦的 traceback 消息(我使用命令行)?至少,我希望每个电话都用一个空行隔开。

2 个答案:

答案 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

»示例1 - 默认回溯

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)

enter image description here

»示例2 - 使用回溯模块的自定义回溯

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)

enter image description here

更改上述代码中的for循环,如下所示:

for exception_message in exception_messages:
    print("-----------------------------------------------------------------------")
    print(exception_message) 

enter image description here