首页 > Python > 如何在不停止/退出程序的情况下捕获并打印完整的异常回溯?

如何在不停止/退出程序的情况下捕获并打印完整的异常回溯?

上一篇 下一篇

我想在不退出的情况下捕获和记录异常,例如,

try:
    do_stuff()
except Exception as err:
    print(Exception, err)
    # I want to print the entire traceback here,
    # not just the exception name and details

我想打印与在没有 try/except 拦截异常的情况下引发异常时打印的完全相同的输出,并且我不希望它退出我的程序。

分割线

网友回答:

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

请注意,在某些极端情况下,您将无法获得预期的结果。在 Python 2.x 中:print_exc

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_infoprint_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

    将回溯返回值分配给处理异常的函数中的局部变量将导致循环引用。这将防止同一函数中的局部变量或回溯引用的任何内容被垃圾回收。[…]如果您确实需要回溯,请确保在使用后将其删除(最好尝试一下…最后声明)

  • 但是,来自同一个文档:

    从 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()[2])

分割线

网友回答:

如果您正在调试并且只想查看当前堆栈跟踪,则只需调用:

traceback.print_stack()

无需手动引发异常只是为了再次捕获它。

模板简介:该模板名称为【如何在不停止/退出程序的情况下捕获并打印完整的异常回溯?】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【Python】栏目查找您需要的精美模板。

相关搜索
  • 下载密码 lanrenmb
  • 下载次数 451次
  • 使用软件 Sublime/Dreamweaver/HBuilder
  • 文件格式 编程语言
  • 文件大小 暂无信息
  • 上传时间 03-21
  • 作者 网友投稿
  • 肖像权 人物画像及字体仅供参考
栏目分类 更多 >
热门推荐 更多 >
微信素材 自适应 微信文章 微信公众平台 微信模板 响应式 企业网站 html5 微信图片 单页式简历模板
您可能会喜欢的其他模板