traceback异常处理相关总结
traceback模块
作用
- traceback模块被用来跟踪异常返回信息
- 可在控制台输出结果
- 可将结果传入文件中记录
常用方法
- print_exc([limit[, file]]): 会自动处理当前 except 块所捕获的异常,将异常传播轨迹信息输出到控制台或指定文件中
- limit: 用于限制显示异常传播的层数,比如函数 A 调用函数 B,函数 B 发生了异常,如果指定 limit=1,则只显示函数 A 里面发生的异常。不设置 limit 参数的话,默认全部显示。
- file: 指定将异常传播轨迹信息输出到指定文件中。不指定该参数,则输出到控制台。
- traceback.format_exc([limit]): 将异常传播轨迹信息转换成字符串
import traceback
try:
raise SyntaxError("traceback test")
except Exception as e:
fp = open("test1.txt", "w", encoding="utf-8") # 创建内存文件对象
traceback.print_exc(file=fp)
traceback.print_exc()
print(traceback.format_exc())
- print_exc([limit[, file]]): 会自动处理当前 except 块所捕获的异常,将异常传播轨迹信息输出到控制台或指定文件中
异常测试
异常信息获取 sys.exc_info()
import traceback
import sys
try:
raise SyntaxError("traceback test")
except Exception as e:
exc_type, exc_value, exc_traceback = sys.exc_info()#元组
print(exc_type, exc_value, exc_traceback)
print(sys.exc_info()) #<class 'SyntaxError'> traceback test <traceback object at 0x000001F8306BA988>
#(<class 'SyntaxError'>, SyntaxError('traceback test',), <traceback object at 0x000001F8306BA988>)
- exc_type: except 块内的异常类型
- exc_value:except 块内的异常值( 异常错误的信息 )
- exc_traceback: 跟踪回溯的对象 (异常传播轨迹)
打印栈的跟踪信息
traceback.print_tb(traceback[, limit[, file]])
tb: 这个就是traceback object, 是我们通过sys.exc_info获取到的
limit: 这个是限制stack trace层级的,如果不设或者为None,就会打印所有层级的stack trace (limit=-1 打印最开始的错误信息)
file: 这个是设置打印的输出流的,可以为文件,也可以是stdout之类的file-like object。如果不设或为None,则输出到sys.stderr
import traceback
import sys
def traceback_test():
try:
raise SyntaxError('traceback_test')
except Exception as e:
traceback.print_tb(e, limit=1, file=sys.stdout)
if __name__ == '__main__':
traceback_test()
#错误信息
Traceback (most recent call last):
File "D:/MH_code/test_flask_project/app/traceback.py", line 14, in <module>
traceback_test()
File "D:/MH_code/test_flask_project/app/traceback.py", line 11, in traceback_test
traceback.print_tb(e, limit=1, file=sys.stdout)
File "C:\Python27\lib\traceback.py", line 61, in print_tb
f = tb.tb_frame
AttributeError: 'exceptions.SyntaxError' object has no attribute 'tb_frame'
打印异常信息
traceback.print_exception(type, value, traceback[, limit[, file]])
(type, value, traceback)为sys.exc_info()返回的元组
如果traceback不为空, 打印栈头信息(即最近被调用的信息)
在栈的信息后打印异常类型和参数(错误信息)
如果是语法错误, 会打印对应的代码行数, 用”^”指明语法错误的位置
import traceback
import sys
def traceback_test():
try:
raise SyntaxError('traceback_test')
except Exception as e:
exc_type, exc_value, exc_traceback = sys.exc_info()
traceback.print_exception(exc_type, exc_value, exc_traceback,limit=2,file=sys.stdout)
if __name__ == '__main__':
traceback_test()
#错误信息
Traceback (most recent call last):
File "C:/Users/24479/Desktop/作业上传/个人总结区/方法学习/test.py", line 7, in traceback_test
raise SyntaxError('traceback_test')
File "<string>", line None
SyntaxError: traceback_test
简写,常用
traceback.print_exc([limit[, file]])
自动执行exc_info()来帮助获取这三个参数
异常处理规则
成功的异常处理应该实现如下4个目标
- 使程序代码混乱最小化
- 捕获并保留诊断信息
- 通知合适的人员
- 采用合适的方式结束异常活动
不要过度使用异常
滥用异常机制会带来负面影响,过度使用异常体现在两个方面:
- 把异常和普通错误混淆在一起,不再编写任何错误处理代码,而是以简单的引发异常来代替所有的错误处理。
- 使用异常处理来代替流程控制
要注意的是:异常处理机制的初衷是将不可预期异常的处理代码和正常的业务逻辑处理代码分离,因此绝不要使用异常处理来代替正常的业务逻辑判断。另外,异常机制的效率比正常的流程控制效率差,所以不要使用异常处理来代替正常的程序流程控制。
不要使用太庞大的 try 块
try 块的代码过于庞大会造成 try 块中出现异常的可能性大大增加,导致分析异常原因的难度也大大增加。try 块很庞大时,后面需要大量的 except 块才可针对不同的异常提供不同的处理逻辑,在同一个 try 块后使用大量的 except 块则需要分析它们之间的逻辑关系,反而增加编程复杂度。
所以大的 try 块可分割成多个可能出现异常的程序段落,并将其放在单独的 try 块中,从而分别捕获并处理异常。
不要忽略捕获到的异常
当产生异常时,在 except 块里应做一些有用的事情,如处理并修复异常,不能将 except 块设置为空或者简单的打印异常信息。对异常采取适当的措施,例如
- 处理异常。对异常进行合适的修复,然后绕过异常发生的地方继续运行;或者用别的数据进行计算,以代替期望的方法返回值;或者提示用户重新操作等等,总之,程序应尽量修复异常,使程序能恢复运行。
- 重新引发新异常。把当前运行环境下能做的事情尽量做完,然后进行异常转译,把异常包装成当前层的异常,重新上传给上层调用者。
- 在合适的层处理异常。如果当前层不清楚如何处理异常,就不要在当前层使用 except 语句来捕获该异常,让上层调用者来负责处理该异常。
traceback异常处理相关总结的更多相关文章
- Python traceback 异常处理
刚接触Python的时候,简单的异常处理已经可以帮助我们解决大多数问题,但是随着逐渐地深入,我们会发现有很多情况下简单的异常处理已经无法解决问题了,如下代码,单纯的打印异常所能提供的信息会非常有限. ...
- python异常处理和断言
http://blog.csdn.net/pipisorry/article/details/21841883 关于异常处理有必要么的讨论 最重要的问题是你在开发过程中隐藏了bug,如果当时你没加这个 ...
- python异常处理的哲学
所谓异常指的是程序的执行出现了非预期行为,就好比现实中的做一件事过程中总会出现一些意外的事.异常的处理是跨越编程语言的,和具体的编程细节相比,程序执行异常的处理更像是哲学.限于认知能力和经验所限,不可 ...
- [转] Python Traceback详解
追莫名其妙的bugs利器-mark- 转自:https://www.jianshu.com/p/a8cb5375171a Python Traceback详解 刚接触Python的时候,简单的 ...
- Python traceback的优雅处理
刚接触Python的时候,简单的异常处理已经可以帮助我们解决大多数问题,但是随着逐渐地深入,我们会发现有很多情况下简单的异常处理已经无法解决问题了,如下代码,单纯的打印异常所能提供的信息会非常有限. ...
- (69)Python异常处理与断言
http://blog.csdn.net/pipisorry/article/details/21841883 断言 断言是一句必须等价于布尔真的判定;此外,发生异常也意味着表达式为假.这些工作类似于 ...
- Spring Boot异常处理详解
在Spring MVC异常处理详解中,介绍了Spring MVC的异常处理体系,本文将讲解在此基础上Spring Boot为我们做了哪些工作.下图列出了Spring Boot中跟MVC异常处理相关的类 ...
- Spring MVC异常处理详解
Spring MVC中异常处理的类体系结构 下图中,我画出了Spring MVC中,跟异常处理相关的主要类和接口. 在Spring MVC中,所有用于处理在请求映射和请求处理过程中抛出的异常的类,都要 ...
- Delphi中的异常处理
转载:http://www.cnblogs.com/doit8791/archive/2012/05/08/2489471.html 以前写Delphi程序一直不注意异常处理,对其异常处理的机制总是一 ...
随机推荐
- Python3学习笔记(十):赋值语句和布尔值
一.赋值语句 1.序列解包 多个赋值同时进行: >>> x,y,z = 1, 2, 3 >>> print(x, y, z) 1 2 3 变量交换: >> ...
- 通过Flink实现个推海量消息数据的实时统计
背景 消息报表主要用于统计消息任务的下发情况.比如,单条推送消息下发APP用户总量有多少,成功推送到手机的数量有多少,又有多少APP用户点击了弹窗通知并打开APP等.通过消息报表,我们可以很直观地看到 ...
- 分布式-信息方式-ActiveMQ的Destination高级特性1
ActiveMQ的Destination高级特性 Destination高级特性----->Composite Destinations 组合队列Composite Destinations : ...
- 解析XML的几种方式:DOM、SAX、PULL
DOM解析 解析器读入整个文档,然后构建一个主流内存的树结构,然后代码就可以使用dom接口来操作这个树结构. 优点: 整个文档树在内存中,便于操作:支持删除.修改.重新排列等多种功能. 通过树形结构存 ...
- Docker入门-构建第一个Java程序
定制镜像 准备一个没有第三方依赖的java web项目,可能参考示例maven结构项目: session-web.war 把该war上传到安装有docker软件的服务器上宿主目录下.在同级目录创建Do ...
- 搭建前端性能showslow平台
ShowSlow是一个可以帮助监测各种网站性能指标趋势变化的开源工具.通过收集YSlow,Page Speed,WebPageTest和dynaTrace AJAX排名的数据形成图表以帮助了解网站的变 ...
- React 中 refs 的作用是什么?
Refs 是 React 提供给我们的安全访问 DOM 元素或者某个组件实例的句柄.我们可以为元素添加 ref 属性然后在回调函数中接受该元素在 DOM 树中的句柄,该值会作为回调函数的第一个参数返回 ...
- leetcode-easy-dynamic-198 House Robber-NO
mycode 思路: a:1 2 3 4 5 6 7 8 9 f(9) =max( f(7) + a9 ,f(8)) 前一步.前两步 至于前三步 f(9) = f(6)+ a9,但其实f(7)在求值的 ...
- 清北学堂2019.8.10 & 清北学堂2019.8.11 & 清北学堂2019.8.12
Day 5 杨思祺(YOUSIKI) 今天的难度逐渐上升,我也没做什么笔记 开始口胡正解 今天的主要内容是最小生成树,树上倍增和树链剖分 最小生成树 Prim 将所有点分为两个集合,已经和点 1 连通 ...
- leetcode 137单词接龙
直接层序遍历,结果有部分测试样例超时: class Solution { public: int ladderLength(string beginWord, string endWord, vect ...