异常捕捉

  通常我们在项目中,针对异常的捕捉会使用 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 模块的更多相关文章

  1. python3 操作MYSQL实例及异常信息处理--用traceback模块

    # 用traceback模块查看异常import traceback import pymysql db = pymysql.connect(host='localhost', user='root' ...

  2. python标准库介绍——24 traceback 模块详解

    ==traceback 模块== [Example 2-18 #eg-2-18] 展示了 ``traceback`` 模块允许你在程序里打印异常的跟踪返回 (Traceback)信息, 类似未捕获异常 ...

  3. Logging模块 + traceback模块 + importlib模块 + requests模块

    Logiging模块日志级别 CRITICAL = 50FATAL = CRITICALERROR = 40WARNING = 30WARN = WARNINGINFO = 20DEBUG = 10N ...

  4. python之异常处理和re模块补充

    一.re模块的补充 1.从一个字符串中获取要匹配的内容 findall:返回一个列表 2.search ***** 验证用户输入内容 '^正则规则$':返回一个对象,用group()取值 3.matc ...

  5. Python全栈开发:模块

    模块,用一砣代码实现了某个功能的代码集合. 参考资源:http://www.cnblogs.com/alex3714/articles/5161349.html 类似于函数式编程和面向过程编程,函数式 ...

  6. Python traceback模块简单使用

    Python中的traceback模块被用于跟踪异常返回信息,可以在logging中记录下traceback. traceback.format_exc() 获取异常为字符串,保存到日志文件 try: ...

  7. Python全栈开发【模块】

    Python全栈开发[模块] 本节内容: 模块介绍 time random os sys json & picle shelve XML hashlib ConfigParser loggin ...

  8. Python全栈之路----常用模块----subprocess模块

    我们经常需要通过Python去执行一条系统命令或脚本,系统的shell命令是独立于你的python进程之外的,每执行一条命令,就是发起一个新进程,通过python调用系统命令或脚本的模块在python ...

  9. Python 捕捉traceback异常栈信息

    捕捉traceback异常栈信息   by:授客 QQ:1033553122 相关函数简介 sys.exc_info() 返回包含3个元素(type, value, traceback)的元组,提供关 ...

随机推荐

  1. VMware虚拟化kvm安装部署总结

    虚拟化 1.环境 Centos7.3 关闭selinux,关闭防火墙 2.虚拟化环境配置 2.1 kvm部署安装 1. VMware 配置桥接模式 2.bios开启虚拟机,以本地台式机为例, 重启动电 ...

  2. 百度UEditor添加视频 增加支持“通用代码”功能,支持微信

    今天发现用UEditor默认的添加视频,在微信内置浏览器里无法正常显示.估计是微信屏蔽了UEditor使用的<embeded>标签.插入iframe形式的通用代码则能正常显示. 用百度UE ...

  3. 201671030123叶虹 实验十四 团队项目评审&课程学习总结

    项目 内容 这个作业属于哪个课程 软件工程 这个作业的要求在哪里 实验十四 团队项目评审&课程学习总结 课程学习目标 掌握软件项目评审会流程:反思总结课程学习内容 一.实验一问题回答 1.实验 ...

  4. arrayAppend.php

    <?php $t_full_projects = array(); $t_full_projects[] ='a'; $t_full_projects[] ='b'; $t_full_proje ...

  5. Spark RDD :Spark API--图解Spark API

    面试题引出: 简述Spark的宽窄依赖,以及Spark如何划分stage,每个stage又根据什么决定task个数? Stage:根据RDD之间的依赖关系的不同将Job划分成不同的Stage,遇到一个 ...

  6. input type=file实现图片上传

    <label for="file"> <img src="images/morende.jpg" alt=""> & ...

  7. OpenCV 学习笔记(0)两幅图像标定配准

    参考教程 依赖opencv扩展库,使用sifi匹配 保存配准信息 "./config/calibratedPara.yaml" #include <iostream> ...

  8. Numpy | 06 从已有的数组创建数组

    numpy.asarray numpy.asarray 类似 numpy.array,但 numpy.asarray 参数只有三个,比 numpy.array 少两个. numpy.asarray(a ...

  9. nginx 访问控制之 认证

    安装httpd yum install -y httpd 使用htpasswd生产密码文件 htpasswd -c /usr/local/nginx/conf/htpasswd aming# -c 表 ...

  10. TDD(测试驱动开发)

    什么是 TDDTDD 有广义和狭义之分,常说的是狭义的 TDD,也就是 UTDD(Unit Test Driven Development).广义的 TDD 是 ATDD(Acceptance Tes ...