Python 处理异常栈模块——traceback 模块
异常捕捉
通常我们在项目中,针对异常的捕捉会使用 try + except,基本形式如下:
try:
# 主代码
except IndexError as e: # 索引异常时执行这里
logger.debug(e)
except KeyError as e: # 关键字异常时执行这里
logger.debug(e)
except ValueError as e: # 值异常时执行这里
logger.debug(e)
except Exception as e: # 万能异常,若出现了与上述指定的异常不同的异常,就走这里
logger.debug(e)
上述方式有一个弊端,假设我们的主代码中有一个报错,那么日志输出时只会有一行异常对象的值,我们无法追踪定位到底是第几行报错,只能凭程序员的经验或直觉去判断。这时我们可以试试使用 traceback 模块。
traceback
traceback 模块提供三个方法
traceback.print_exc() # 在屏幕中输出异常栈
traceback.format_exc() # 把异常栈以字符串的形式返回,print(traceback.format_exc()) 的效果相当于 traceback.print_exc()
traceback.print_exception() # 其实traceback.print_exc()函数只是traceback.print_exception()函数的一个简写形式,而它们获取异常相关的数据都是通过sys.exc_info()函数得到的
示例
def func(a, b):
return a / b
if __name__ == '__main__':
import sys
import traceback
try:
func(1, 0)
except Exception as e:
print("eeeeeeeeeeeeeeeeee")
exc_type, exc_value, exc_tb = sys.exc_info()
print(exc_type)
print(exc_value)
print(exc_tb)
traceback.print_exception(exc_type, exc_value, exc_tb) # 效果等同于traceback.print_exc()
'''
sys.exc_info()返回的值是一个元组,
exc_type是异常的对象类型,
exc_value是异常的值,
exc_tb是一个traceback对象,对象中包含出错的行数、位置等数据。
然后通过print_exception函数对这些异常数据进行整理输出。
'''
其中,元祖的第三个元素 exc_tb 还可以细分
# traceback模块提供了 extract_tb 函数来更加详细的解释 traceback 对象所包含的数据
def func(a, b):
return a / b
if __name__ == '__main__':
import sys
import traceback
try:
func(1, 0)
except:
_, _, exc_tb = sys.exc_info()
for filename, linenum, funcname, source in traceback.extract_tb(exc_tb):
print("%-23s:%s '%s' in %s()" % (filename, linenum, source, funcname)) '''
输出结果:
samchimac:tracebacktest samchi$ python ./teststacktrace.py
./teststacktrace.py :7 'func(1, 0)' in <module>()
./teststacktrace.py :2 'return a / b' in func()
'''
写入日志
traceback 的 三个方法中,print_exc() 和 print_exception() 都没有返回值,只输出到控制台(屏幕),如果要写入日志,使用 format_exc(),日志的异常输出会定位到具体行
import traceback try:
# 主代码
except IndexError as e: # 索引异常时执行这里
logger.debug(traceback.format_exc())
except KeyError as e: # 关键字异常时执行这里
logger.debug(traceback.format_exc())
except ValueError as e: # 值异常时执行这里
logger.debug(traceback.format_exc())
except Exception as e: # 万能异常,若出现了与上述指定的异常不同的异常,就走这里
logger.debug(traceback.format_exc())
参考:https://www.jianshu.com/p/01ed4b8d7d9a
Python 处理异常栈模块——traceback 模块的更多相关文章
- python3 操作MYSQL实例及异常信息处理--用traceback模块
# 用traceback模块查看异常import traceback import pymysql db = pymysql.connect(host='localhost', user='root' ...
- python标准库介绍——24 traceback 模块详解
==traceback 模块== [Example 2-18 #eg-2-18] 展示了 ``traceback`` 模块允许你在程序里打印异常的跟踪返回 (Traceback)信息, 类似未捕获异常 ...
- Logging模块 + traceback模块 + importlib模块 + requests模块
Logiging模块日志级别 CRITICAL = 50FATAL = CRITICALERROR = 40WARNING = 30WARN = WARNINGINFO = 20DEBUG = 10N ...
- python之异常处理和re模块补充
一.re模块的补充 1.从一个字符串中获取要匹配的内容 findall:返回一个列表 2.search ***** 验证用户输入内容 '^正则规则$':返回一个对象,用group()取值 3.matc ...
- Python全栈开发:模块
模块,用一砣代码实现了某个功能的代码集合. 参考资源:http://www.cnblogs.com/alex3714/articles/5161349.html 类似于函数式编程和面向过程编程,函数式 ...
- Python traceback模块简单使用
Python中的traceback模块被用于跟踪异常返回信息,可以在logging中记录下traceback. traceback.format_exc() 获取异常为字符串,保存到日志文件 try: ...
- Python全栈开发【模块】
Python全栈开发[模块] 本节内容: 模块介绍 time random os sys json & picle shelve XML hashlib ConfigParser loggin ...
- Python全栈之路----常用模块----subprocess模块
我们经常需要通过Python去执行一条系统命令或脚本,系统的shell命令是独立于你的python进程之外的,每执行一条命令,就是发起一个新进程,通过python调用系统命令或脚本的模块在python ...
- Python 捕捉traceback异常栈信息
捕捉traceback异常栈信息 by:授客 QQ:1033553122 相关函数简介 sys.exc_info() 返回包含3个元素(type, value, traceback)的元组,提供关 ...
随机推荐
- Go基本运行编译命令解释
go run命令: 直接执行命令源码文件:一定要声明自己是在main包下,要是只有一个工作区,相应的文件就会存在bin文件下 go build: 把文件夹下的命令源码文件编译成直接运行文件,但是不能有 ...
- DFS(一):砌墙问题
问题描述 使用两种砖头砌墙,砖头A宽为2,高为1,砖头B宽为3,高为1,用这两种砖头砌一面宽为W,高为H的墙. 为了使墙牢固性高,要求每种砖只能横向摆放,不能竖起来,且除了两侧以外,不能出现上下对齐的 ...
- httprunner学习23-加解密
前言 有些接口的请求参数是加密的,返回的接口内容也是需要解密才能看到. 加密接口 比如当我们访问下面这个登陆的接口时,请求参数账号和密码都是需要加密,通过parms参数传过去,服务器才能识别到 没加密 ...
- spring-boot子模块打包的jar中去掉BOOT-INF文件夹
1.spring-boot maven打包,一般pom.xml文件里会加 <plugin> <groupId>org.springframework.boot</grou ...
- Linux下如何退出vim的一些常用命令总结
1.保存并退出 linux下安装好了vim以及gcc后,我们开始新建一个c文件,例如: vim test.c 之后进入vim的编辑框中,点击i进入插入模式,开始编辑程序,当你编写好自己的程序之后,按E ...
- javascript Date format(js日期格式化) 转载
本文转载地址http://www.cnblogs.com/zhangpengshou/archive/2012/07/19/2599053.html // 对Date的扩展,将 Date 转化为指定格 ...
- Go语言 - 结构体 | 方法
自定义类型和类型别名 自定义类型 在Go语言中有一些基本的数据类型,如string.整型.浮点型.布尔等数据类型, Go语言中可以使用type关键字来定义自定义类型. 自定义类型是定义了一个全新的类型 ...
- dotnet core linux 接入支付宝H5支付,提示:System.PlatformNotSupportedException","Message":"'CspParameters' requires Windows Cryptographic API (CAPI), which is not available on this platform.
用的官方提供的demo,实际上部署后却出现了上图的错误.和技术支持沟通无效后,走上了不归路. 在微软的github dotnet/core开源库提交了issue后,终于获得了解决.附上链接:https ...
- ant-design-vue有v-decorator时defaultValue无效
<a-input v-decorator="[ 'userName', { rules: [ { required: true, message: '请输入您的账号!' } ], in ...
- 【JZOJ6233】【20190627】心的旋律
题目 你需要构造一个\(n\)个点的二分图 定义\(F(A)\)表示左部点集\(A\)能够到达的右部中的点 使得满足 $ F(A) \lt |A| $ 的集合恰好有 $ k $ 个 \(1 \le n ...