python中traceback获取异常信息
在日常工作中,我们常常会碰到异常,我们想在异常发生的时候,不但能显示异常发生的位置,还能看到异常方法被调用的堆栈信息,在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获取异常信息相关推荐
- java获取异常信息_Python中获取异常(Exception)信息
异常信息的获取对于程序的调试非常重要,可以有助于快速定位有错误程序语句的位置.下面介绍几种python中获取异常信息的方法,这里获取异常(Exception)信息采用try...except...程序 ...
- python中什么是异常_一文教你读懂 Python 中的异常信息
在写 Python 代码的时候,当代码中出现错误,会在输出的时候打印 Traceback 错误信息,很多初学者看到那一堆错误信息,往往都会处于懵逼状态,脑中总会冒出一句,这都是些啥玩意.如果你是第一 ...
- crashdumpandroid_Android 中Crash时如何获取异常信息详解及实例
Android 中Crash时如何获取异常信息详解 前言: 大家都知道,Android应用不可避免的会发生crash,无论你的程序写的多完美,总是无法完全避免crash的发生,可能是由于Android ...
- 在python中、如果异常并未被处理或捕捉_Python异常处理总结
本文较为详细的罗列了Python常见的异常处理,供大家参考,具体如下: 1. 抛出异常和自定义异常 Python用异常对象(exception object)表示异常情况,遇到错误后,会引发异常.如果 ...
- 在python中用于触发异常的是_下列选项中,用于触发异常的是()。 (3.0分)_学小易找答案...
[填空题]当使用序列中不存在的____时,会引发IndexError异常. (3.0分) [简答题]2017国考地市级: (三)假如你是某报社记者,请根据"给定资料3",以&quo ...
- python中所有的异常类都是谁的子类_Python中所有的异常类都是____的子类。
[简答题]假设成年人的体重和身高存在此种关系: 身高(厘米)-100 =标准体重(千克) 如果一个人的体重与其标准体重的差值在正负5%之间,显示"体重正常",其他则显示" ...
- java读取对象失败_jsp exception对象获取异常信息
获取异常信息的exception对象 exception内置对象用来处理JSP文件执行时发生的所有错误和异常.exception对象和Java的所有对象一样,都具有系统的继承结构,exception对 ...
- python,ffprobe获取视频信息
背景 需要获取视频基础信息,如果分辨率.大小.播放时长等,研究发现ffprobe工具已经提供了非常全面的视频信息,用ffprobe分析视频很简单,且看我是怎么在python码中调用ffprobe来提取 ...
- python 获取金融数据_class类在python中如何获取金融数据
class类在python中如何获取金融数据 发布时间:2020-12-11 11:12:06 来源:亿速云 阅读:101 作者:小新 这篇文章主要介绍了class类在python中如何获取金融数据, ...
最新文章
- Python MemoryError 问题
- powershell实例第1讲:判断某个文件夹是否存在,存在则删除
- 使数据区“可执行”的几种常规办法
- Nginx配置实例-反向代理实现浏览器请求Nginx跳转到服务器某页面
- hadoop配置2.6.1 centos7
- python 中locals() 和 globals()
- 阿里为什么推崇java_为什么阿里巴巴 Java 开发手册推荐使用 LongAdder,而不是 volatile?...
- node ,express框架后台设置跨域操作,路由中间件
- bzoj 3437 小p的农场
- 18.卷1(套接字联网API)---路由套接字
- 用什么工具可以制作gif?分享一款在线制作gif动画工具
- 腾讯云服务器的功能与优势体现在哪里?为新手选择服务器提供参考
- word论文排版和写作02:插入算法的伪代码
- less和css的区别是什么
- 坑爹的苹果机不执行ajax请求,苹果机加载外部Jquery失败
- 全选、删除、撤回、剪切、复制、粘贴、永久性删除、新建文件夹、启动任务管理器、退出的快捷键
- UIDatePicker得到的时间中怎么去掉时分秒(字符串操作知识拓展)--iOS开发
- 破解微信包工具之vscode
- 【直播回顾】昇思MindSpore易用性SIG2022上半年回顾总结
- poi设置word表格单元格宽度_java poi 设置word 格式如表格一类的
热门文章
- 我炒股十五年,亏损超过五十万,我该怎么办?
- webpack中的style-resources-loader加载全局css变量
- 手把手教你做主成分分析
- Django相关操作(连续跳转和登录注册为例)
- python-xlrd使用手册
- uni-app - H5 网站项目接入集成 51LA 网站统计详细教程(提供 51LA.js 官方插件与引入教程)
- yum -y insytall nmap报错:​​​​​​​​已加载插件:fastestmirrorLoading mirror speeds from cached hostfile
- 作为潮汕人你了解肠粉么 附带家常肠粉做法
- 抖音企业号抖音智能营销系统源码待开发技术。。。。。
- 抖音头条小程序常见的问题