在日常工作中,我们常常会碰到异常,我们想在异常发生的时候,不但能显示异常发生的位置,还能看到异常方法被调用的堆栈信息,在python中怎么实现呢?
实际上python提供了一个traceback来实现类似功能,这个模块提供了一个标准接口来提取、格式化和打印Python程序的堆栈跟踪。它完全模仿Python解释器打印堆栈跟踪时的行为。当您希望在程序控制下打印堆栈跟踪时,这非常有用。

那这个traceback对象怎么来,在异常的情况下我们怎么获取堆栈信息呢,下面我们举一个例子

# -*- coding: utf-8 -*-
import traceback, sysdef lumberjack():bright_side_of_life()def bright_side_of_life():return tuple()[0]if __name__ == '__main__':try:lumberjack()except IndexError:exc_type, exc_value, exc_traceback = sys.exc_info()print("*** print_tb:")traceback.print_tb(exc_traceback, limit=1, file=sys.stdout)print("*** print_exception:")traceback.print_exception(exc_type, exc_value,exc_traceback, limit=2, file=sys.stdout)print("*** print_exc:")traceback.print_exc(limit=2, file=sys.stdout)print("*** format_exc, first and last line:")formatted_lines = traceback.format_exc().splitlines()print(formatted_lines[0])print(formatted_lines[-1])print("*** format_exception:")print(repr(traceback.format_exception(exc_type, exc_value,exc_traceback)))print("*** extract_tb:")print(repr(traceback.extract_tb(exc_traceback)))print("*** format_tb:")print(repr(traceback.format_tb(exc_traceback)))print("*** tb_lineno:", exc_traceback.tb_lineno)

输出如下:

*** print_tb:File "D:/WorkSheet/PyhonWorkSheet/demo/traceback_test.py", line 26, in <module>lumberjack()
*** print_exception:
Traceback (most recent call last):File "D:/WorkSheet/PyhonWorkSheet/demo/traceback_test.py", line 26, in <module>lumberjack()File "D:/WorkSheet/PyhonWorkSheet/demo/traceback_test.py", line 17, in lumberjackbright_side_of_life()
IndexError: tuple index out of range
*** print_exc:
Traceback (most recent call last):File "D:/WorkSheet/PyhonWorkSheet/demo/traceback_test.py", line 26, in <module>lumberjack()File "D:/WorkSheet/PyhonWorkSheet/demo/traceback_test.py", line 17, in lumberjackbright_side_of_life()
IndexError: tuple index out of range
*** format_exc, first and last line:
Traceback (most recent call last):
IndexError: tuple index out of range
*** format_exception:
['Traceback (most recent call last):\n', '  File "D:/WorkSheet/PyhonWorkSheet/demo/traceback_test.py", line 26, in <module>\n    lumberjack()\n', '  File "D:/WorkSheet/PyhonWorkSheet/demo/traceback_test.py", line 17, in lumberjack\n    bright_side_of_life()\n', '  File "D:/WorkSheet/PyhonWorkSheet/demo/traceback_test.py", line 21, in bright_side_of_life\n    return tuple()[0]\n', 'IndexError: tuple index out of range\n']
*** extract_tb:
[<FrameSummary file D:/WorkSheet/PyhonWorkSheet/demo/traceback_test.py, line 26 in <module>>, <FrameSummary file D:/WorkSheet/PyhonWorkSheet/demo/traceback_test.py, line 17 in lumberjack>, <FrameSummary file D:/WorkSheet/PyhonWorkSheet/demo/traceback_test.py, line 21 in bright_side_of_life>]
*** format_tb:
['  File "D:/WorkSheet/PyhonWorkSheet/demo/traceback_test.py", line 26, in <module>\n    lumberjack()\n', '  File "D:/WorkSheet/PyhonWorkSheet/demo/traceback_test.py", line 17, in lumberjack\n    bright_side_of_life()\n', '  File "D:/WorkSheet/PyhonWorkSheet/demo/traceback_test.py", line 21, in bright_side_of_life\n    return tuple()[0]\n']
*** tb_lineno: 26

我们来解读一个程序,这个程序很简单 ,在lumberjack()方法里调用了bright_side_of_life()方法,bright_side_of_life里面有个空元组,并索引元组的第一个元素,由于是空元组,索引肯定会报错的,所以 程序就跳到了异常处理 except里面(实际上我们也主要是讲怎么获取异常信息的)。
第一句

exc_type, exc_value, exc_traceback = sys.exc_info()

通过系统的exc_info方法获取了exc_type, exc_value, exc_tracebac(分别对应异常类型、异常值、堆栈信息对象),有了这三个值之后我们就能通过trackback这个模块来输出异常信息了。

traceback.print_tb(exc_traceback, limit=1, file=sys.stdout)

这个方法就是打印堆栈信息的,limit参数是打印堆栈信息的深度,如果是None就是全部打印,在这个例子中输出的结果为(这里只输出了一层,因为我们limit=1)

*** print_tb:File "D:/WorkSheet/PyhonWorkSheet/demo/traceback_test.py", line 26, in <module>lumberjack()

光打印堆栈信息好像还少点什么,比如我还想知道什么类型的异常,有没有打印更全面的,有

traceback.print_exception(exc_type, exc_value,exc_traceback, limit=2, file=sys.stdout)

它与print_tb()在以下方面不同:
(1)如果traceback不是None,它打印一个报头“Traceback (most recent call last):”;
(2)输出异常类型和异常值堆栈跟踪;
(3)如果type是SyntaxError(语法错误),它打印语法错误所在的行发生时,下一行上有一个插入符号表示近似错误的位置。
例子中输出的结果为

*** print_exception:
Traceback (most recent call last):File "D:/WorkSheet/PyhonWorkSheet/demo/traceback_test.py", line 26, in <module>lumberjack()File "D:/WorkSheet/PyhonWorkSheet/demo/traceback_test.py", line 17, in lumberjackbright_side_of_life()
IndexError: tuple index out of range

traceback.print_exception方法还需要传入错误类型、错误值、堆栈跟踪对象等,挺麻烦的,有没有不需要传入这些一些的更简便的方法呢,有的就是traceback.print_exc
traceback.print_exc(limit=2, file=sys.stdout)

其实 它不需要传入上面提到的三个参数,它函数内部自己通过sys.exc_info()获取了,所以 traceback.print_exc是traceback.print_exception的简便版,输出的信息是一样的。

我现在不想输出到控制台上,我想以字符串的形式收集然后记录在日志里面,有没有以字符串形式返回这些信息的,是有的

 formatted_lines = traceback.format_exc()

traceback.format_exc()和traceback.print_exc的内容是一样的 只是它返回为字符串,方便你收集。
traceback.format_exc是traceback.format_exception简便版,不需要传入我们上面说的故障类型、故障值、堆栈跟踪对象这三个参数。

traceback.format_tb是traceback.extract_tb返回值的格式化版本,traceback.extract_tb返回一个StackSummary对象来自回溯的预处理条目列表。

python中traceback获取异常信息相关推荐

  1. java获取异常信息_Python中获取异常(Exception)信息

    异常信息的获取对于程序的调试非常重要,可以有助于快速定位有错误程序语句的位置.下面介绍几种python中获取异常信息的方法,这里获取异常(Exception)信息采用try...except...程序 ...

  2. python中什么是异常_一文教你读懂 Python 中的异常信息

    在写 Python 代码的时候,当代码中出现错误,会在输出的时候打印 Traceback  错误信息,很多初学者看到那一堆错误信息,往往都会处于懵逼状态,脑中总会冒出一句,这都是些啥玩意.如果你是第一 ...

  3. crashdumpandroid_Android 中Crash时如何获取异常信息详解及实例

    Android 中Crash时如何获取异常信息详解 前言: 大家都知道,Android应用不可避免的会发生crash,无论你的程序写的多完美,总是无法完全避免crash的发生,可能是由于Android ...

  4. 在python中、如果异常并未被处理或捕捉_Python异常处理总结

    本文较为详细的罗列了Python常见的异常处理,供大家参考,具体如下: 1. 抛出异常和自定义异常 Python用异常对象(exception object)表示异常情况,遇到错误后,会引发异常.如果 ...

  5. 在python中用于触发异常的是_下列选项中,用于触发异常的是()。 (3.0分)_学小易找答案...

    [填空题]当使用序列中不存在的____时,会引发IndexError异常. (3.0分) [简答题]2017国考地市级: (三)假如你是某报社记者,请根据"给定资料3",以&quo ...

  6. python中所有的异常类都是谁的子类_Python中所有的异常类都是____的子类。

    [简答题]假设成年人的体重和身高存在此种关系: 身高(厘米)-100 =标准体重(千克) 如果一个人的体重与其标准体重的差值在正负5%之间,显示"体重正常",其他则显示" ...

  7. java读取对象失败_jsp exception对象获取异常信息

    获取异常信息的exception对象 exception内置对象用来处理JSP文件执行时发生的所有错误和异常.exception对象和Java的所有对象一样,都具有系统的继承结构,exception对 ...

  8. python,ffprobe获取视频信息

    背景 需要获取视频基础信息,如果分辨率.大小.播放时长等,研究发现ffprobe工具已经提供了非常全面的视频信息,用ffprobe分析视频很简单,且看我是怎么在python码中调用ffprobe来提取 ...

  9. python 获取金融数据_class类在python中如何获取金融数据

    class类在python中如何获取金融数据 发布时间:2020-12-11 11:12:06 来源:亿速云 阅读:101 作者:小新 这篇文章主要介绍了class类在python中如何获取金融数据, ...

最新文章

  1. Python MemoryError 问题
  2. powershell实例第1讲:判断某个文件夹是否存在,存在则删除
  3. 使数据区“可执行”的几种常规办法
  4. Nginx配置实例-反向代理实现浏览器请求Nginx跳转到服务器某页面
  5. hadoop配置2.6.1 centos7
  6. python 中locals() 和 globals()
  7. 阿里为什么推崇java_为什么阿里巴巴 Java 开发手册推荐使用 LongAdder,而不是 volatile?...
  8. node ,express框架后台设置跨域操作,路由中间件
  9. bzoj 3437 小p的农场
  10. 18.卷1(套接字联网API)---路由套接字
  11. 用什么工具可以制作gif?分享一款在线制作gif动画工具
  12. 腾讯云服务器的功能与优势体现在哪里?为新手选择服务器提供参考
  13. word论文排版和写作02:插入算法的伪代码
  14. less和css的区别是什么
  15. 坑爹的苹果机不执行ajax请求,苹果机加载外部Jquery失败
  16. 全选、删除、撤回、剪切、复制、粘贴、永久性删除、新建文件夹、启动任务管理器、退出的快捷键
  17. UIDatePicker得到的时间中怎么去掉时分秒(字符串操作知识拓展)--iOS开发
  18. 破解微信包工具之vscode
  19. 【直播回顾】昇思MindSpore易用性SIG2022上半年回顾总结
  20. poi设置word表格单元格宽度_java poi 设置word 格式如表格一类的

热门文章

  1. 我炒股十五年,亏损超过五十万,我该怎么办?
  2. webpack中的style-resources-loader加载全局css变量
  3. 手把手教你做主成分分析
  4. Django相关操作(连续跳转和登录注册为例)
  5. python-xlrd使用手册
  6. uni-app - H5 网站项目接入集成 51LA 网站统计详细教程(提供 51LA.js 官方插件与引入教程)
  7. yum -y insytall nmap报错:​​​​​​​​已加载插件:fastestmirrorLoading mirror speeds from cached hostfile
  8. 作为潮汕人你了解肠粉么 附带家常肠粉做法
  9. 抖音企业号抖音智能营销系统源码待开发技术。。。。。
  10. 抖音头条小程序常见的问题