如何在不停止程序的情况下打印完整的回溯?

我正在编写一个程序,用于解析10个网站,查找数据文件,保存文件,然后解析它们以生成可在NumPy库中使用的数据。 有的错误该文件通过遇到不良链接,不好的XML,缺项,其他的事情我还没有进行分类。 我最初做这个程序来处理像这样的错误:

try:
    do_stuff()
except:
    pass

但是现在我想记录错误:

try:
    do_stuff()
except Exception, err:
    print Exception, err

请注意,这将打印到日志文件供以后查看。 这通常会打印非常无用的数据。 我想要的是打印错误触发时打印的完全相同的行,而不用try-except拦截异常,但我不希望它中止我的程序,因为它嵌套在一系列for循环中,我希望看到完成。


其他一些答案已经指出了追溯模块。

请注意,在print_exc ,在某些角落案例中,您将无法获得您期望的结果。 在Python 2.x中:

import traceback

try:
    raise TypeError("Oups!")
except Exception, err:
    try:
        raise TypeError("Again !?!")
    except:
        pass

    traceback.print_exc()

...将显示最后一个异常的追溯:

Traceback (most recent call last):
  File "e.py", line 7, in <module>
    raise TypeError("Again !?!")
TypeError: Again !?!

如果您确实需要访问原始追踪,则解决方案是缓存从局部变量中的exc_info返回的异常信息,并使用print_exception显示它:

import traceback
import sys

try:
    raise TypeError("Oups!")
except Exception, err:
    try:
        exc_info = sys.exc_info()

        # do you usefull stuff here
        # (potentially raising an exception)
        try:
            raise TypeError("Again !?!")
        except:
            pass
        # end of useful stuff


    finally:
        # Display the *original* exception
        traceback.print_exception(*exc_info)
        del exc_info

生产:

Traceback (most recent call last):
  File "t.py", line 6, in <module>
    raise TypeError("Oups!")
TypeError: Oups!

尽管如此,几乎没有什么缺陷:

  • sys_info的文档:

    将回溯返回值分配给处理异常的函数中的局部变量将导致循环引用 。 这将防止在同一个函数中由局部变量引用的任何东西,或者通过垃圾收集回溯。 [...] 如果你确实需要回溯,请确保在使用后删除它 (最好用try ... finally语句完成)

  • 但是,从相同的文档:

    从Python 2.2开始,当启用垃圾回收并且无法访问时, 会自动回收这些循环 ,但避免创建循环仍然更有效。


  • 另一方面,通过允许你访问与异常相关的回溯,Python 3产生了一个不太令人惊讶的结果:

    import traceback
    
    try:
        raise TypeError("Oups!")
    except Exception as err:
        try:
            raise TypeError("Again !?!")
        except:
            pass
    
        traceback.print_tb(err.__traceback__)
    

    ...将显示:

      File "e3.py", line 4, in <module>
        raise TypeError("Oups!")
    

    traceback.format_exc()sys.exc_info()会产生更多的信息,如果这是你想要的。

    import traceback
    import sys
    
    try:
        do_stuff()
    except Exception:
        print(traceback.format_exc())
        # or
        print(sys.exc_info()[0])
    

    如果您正在调试并只想查看当前的堆栈跟踪,则可以简单地调用:

    traceback.print_stack()

    没有必要手动提出异常,以便再次捕获它。

    链接地址: http://www.djcxy.com/p/55185.html

    上一篇: How to print the full traceback without halting the program?

    下一篇: Accessing a Python traceback from the C API