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)的元组,提供关 ...
随机推荐
- ELK快速入门(三)logstash收集日志写入redis
ELK快速入门三-logstash收集日志写入redis 用一台服务器部署redis服务,专门用于日志缓存使用,一般用于web服务器产生大量日志的场景. 这里是使用一台专门用于部署redis ,一台专 ...
- linux 管道,输出重定向,后端执行
1. | (管道) $time|data:"Y-m-d"将前部的输出,作为后部的输入:配合管道使用的命令,典型的就是grep,more find --help | grep cne ...
- IDisposable 接口
提供一种用于释放非托管资源的机制. 地址:https://docs.microsoft.com/zh-cn/dotnet/api/system.idisposable?view=netframewor ...
- java.util. Arrays.sort(scores);
import java.util.*; public class ArraySortScore { //完成 main 方法 public static void main(String[] args ...
- SQL编程规范整理
一.排版规范 1.代码缩进 对于判断.循环等处理使用字符缩进 缩进的空格最好不要使用TAB键 2.空格及换行 变量定义.相对独立的程序块等要单独成行,便于阅读 太长的程序(超过110列)应做换行处理 ...
- vue element-ui 饿了么布局,gutter间距碰上bordr 会失效
//如下情况,gutter间距会失效 <el-row :gutter="20"> <el-col :span="12" style=" ...
- DOM是浏览器提供给开发者的语柄、套接字、文件接口
DOM是浏览器提供给开发者的语柄.套接字.文件接口
- linux学习9 运维基本功-Linux常用基础命令实战应用
一.文件系统知识回顾 1.Linux文件系统: a.文件名称严格区分字符大小写 b.文件可以使用除/以外任意字符 c.文件名长度不能超过255个字符 d.以.开头的文件为隐藏文件: . :当前目录 . ...
- make命令与Makefile(转载)
概述博客内容包含linux下make命令的使用与makefile的书写规则等,希望通过本文档使读者对make命令makefile文件有进一步了解,由于鄙人经验学识有限文档中会有描述不准确以及理解偏差, ...
- 简单JSON
JSON是什么 JavaScript Object Notation(JavaScript 对象表示),是一种存储和交换文本信息的语法,它独立程序语言,是轻量级的文本数据交换格式,比XML更小.更快, ...