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)的元组,提供关 ...
随机推荐
- 初入Linux
初步进入linux世界 [Linux 系统启动过程] Linux的启动其实和windows的启动过程很类似,不过windows我们是无法看到启动信息的,而linux启动时我们会看到许多启动信息,例如某 ...
- PHP、asp、aspx、JSP一句话
PHP.asp.aspx.JSP一句话 原文地址:https://www.cnblogs.com/JoEcO01/p/11556413.html 1.asp一句话木马: <%eval requ ...
- 锤子手机做appium自动化测试时,运行脚本总是弹出警告框的问题
当运行脚本的时候,总是提示若干个如上提示框,必须点击同意才能进行下一步:解决方案: 在设置,全局高级设置,开发者选项中打开“总是允许USB安装应用”即可解决:
- spark运行时加载配置文件(hive,hdfs)
文章为转载,如有版权问题,请联系,谢谢! 转自:https://blog.csdn.net/piduzi/article/details/81636253 适合场景:在运行时才确定用哪个数据源 imp ...
- hive中时间操作(一)
转:https://blog.csdn.net/u012474716/article/details/78925319/ hive中常用的时间为时间戳和日期格式之间的转换 常用的函数为: to_dat ...
- Java8新特性之forEach+Lambda 表达式遍历Map和List
这是Java8系列的第二篇,今天来说一下Java8中forEach的简单使用.我们使用对比的方式来看应该会看得更加清楚,更能理解: 一.遍历Map ============Java8之前的方式==== ...
- Go语言 - goroutine
并发与并行 并发:同一时间段内执行多个任务(你在用微信和两个女朋友聊天). 并行:同一时刻执行多个任务(你和你朋友都在用微信和女朋友聊天). Go语言的并发通过goroutine实现.goroutin ...
- Educational Codeforces F. Remainder Problem
[传送门] 题意就是单点加以及查询下标为等差数列位置上的值之和.刚开始看到这道题.我以为一个数的倍数是log级别的.就直接写了发暴力.就T了.还在想为啥,优化了几发才发现不太对劲.然后才想到是$\df ...
- python - django 解决 templates 模板语言语法冲突
# 在使用某个框架时发现语法与Django的模板语法冲突了,于是找到解决方案: {% verbatim %} // 被 verbatim 包裹起来的地方是不会被 django 渲染的 {% endve ...
- XCOPY——目录复制命令
XCOPY——目录复制命令 1.功能:复制指定的目录和目录下的所有文件连同目录结构. 2.类型:外部命令 3.格式:XCOPY [源盘:]〈源路径名〉[目标盘符:][目标路径名][/S][/V][/E ...