traceback:让你更加灵活地处理python的异常
异常
异常在python中是屡见不鲜了,程序在执行到某一行代码时,发现有问题,比如数组索引越界,变量没有定义啊等等,此时就会抛出异常
捕获异常
在python,一般都是使用try···except来对异常进行捕获
try:
1 / 0
except Exception as e:
print(e) # division by zero
然而仅仅只有这些也看不出什么东西来,我们需要知道在哪一行代码引发的异常。
大家在程序报错的时候,会经常看到报错信息如下
Traceback (most recent call last):
这个Traceback是什么鬼?实际上,这是python关于程序报错的回溯信息,来自于一个叫做traceback object的对象,而这个traceback object对象是通过sys.exc_info()来获取的
traceback对象
import sys
try:
1 / 0
except Exception as e:
print(e) # division by zero
exc_type, exc_value, exc_tb = sys.exc_info()
print(exc_type) # <class 'ZeroDivisionError'>
print(exc_value) # division by zero
print(exc_tb) # <traceback object at 0x0000000009F484C8>
可以看到,sys.exc_info()获取了当前处理的exception的相关信息,并返回一个元组。元组的第一个元素是异常的类型,第二个元素是异常的value值,第三个异常信息则是traceback object。print(e)打印的是异常的值。
有了traceback object我们则可以打印和格式化traceback的相关信息
traceback模块
print_tb
接收一个tracebackobject
import sys
import traceback
try:
1 / 0
except NameError as e:
exc_type, exc_value, exc_tb = sys.exc_info()
traceback.print_tb(exc_tb)
"""
File "C:/Users/EDZ/Desktop/satori/wtfpython/1.py", line 6, in <module>
1 / 0
"""
# 如果我们不捕获异常看看输出啥?
"""
Traceback (most recent call last):
File "C:/Users/EDZ/Desktop/satori/wtfpython/1.py", line 6, in <module>
1 / 0
ZeroDivisionError: division by zero
"""
# 可以看到最后一行的ZeroDivisionError则是异常类型,division by zero则是异常值。中间的则是我们的traceback object
然而除了traceback object,print_tb还可以接收两个参数
limit
比如我们在调用C函数出现了异常,但我们是先调用A函数,在A函数里面调用B函数,在B函数里面调用C函数,limit参数则是限制stack trace的层级的,如果为None也就是不指定,那么会打印所有层级import sys
import traceback def C():
1 / 0 def B():
C() def A():
B() try:
A()
except Exception as e:
exc_type, exc_value, exc_tb = sys.exc_info()
traceback.print_tb(exc_tb)
"""
File "C:/Users/EDZ/Desktop/satori/wtfpython/1.py", line 16, in <module>
A()
File "C:/Users/EDZ/Desktop/satori/wtfpython/1.py", line 12, in A
B()
File "C:/Users/EDZ/Desktop/satori/wtfpython/1.py", line 9, in B
C()
File "C:/Users/EDZ/Desktop/satori/wtfpython/1.py", line 6, in C
1 / 0
""" traceback.print_tb(exc_tb, limit=2)
"""
File "C:/Users/EDZ/Desktop/satori/wtfpython/1.py", line 16, in <module>
A()
File "C:/Users/EDZ/Desktop/satori/wtfpython/1.py", line 12, in A
B()
"""
file
可以指定file,输出到某个文件里,默认是sys.stderr
print_exception
与print_tb相比多了两个参数,需要传入exc_type,exc_value,exc_tb,也就是sys.exc_info返回的三个值。与print_tb相比,打印信息多了开头的Traceback (most recent call last):,以及最后一行的异常类型和value信息。还有一个不同是当异常为SyntaxError时,会有"^"来指示语法错误的位置
import sys
import traceback
def C():
1 / 0
def B():
C()
def A():
B()
try:
A()
except Exception as e:
exc_type, exc_value, exc_tb = sys.exc_info()
traceback.print_exception(exc_type, exc_value, exc_tb)
"""
Traceback (most recent call last):
File "C:/Users/EDZ/Desktop/satori/wtfpython/1.py", line 16, in <module>
A()
File "C:/Users/EDZ/Desktop/satori/wtfpython/1.py", line 12, in A
B()
File "C:/Users/EDZ/Desktop/satori/wtfpython/1.py", line 9, in B
C()
File "C:/Users/EDZ/Desktop/satori/wtfpython/1.py", line 6, in C
1 / 0
ZeroDivisionError: division by zero
"""
可以看到,打印的结果和报错的信息是一样的。
print_exc
和print_exception类似,只不过不需要我们手动的传入sys.exc_info返回的三个值,而是会自动帮我们调用
import sys
import traceback
def C():
1 / 0
def B():
C()
def A():
B()
try:
A()
except Exception as e:
traceback.print_exc()
"""
Traceback (most recent call last):
File "C:/Users/EDZ/Desktop/satori/wtfpython/1.py", line 16, in <module>
A()
File "C:/Users/EDZ/Desktop/satori/wtfpython/1.py", line 12, in A
B()
File "C:/Users/EDZ/Desktop/satori/wtfpython/1.py", line 9, in B
C()
File "C:/Users/EDZ/Desktop/satori/wtfpython/1.py", line 6, in C
1 / 0
ZeroDivisionError: division by zero
"""
format_exc
和print_exc一样,只不过是以字符串的形式返回,需要我们自己手动打印
import sys
import traceback
def C():
1 / 0
def B():
C()
def A():
B()
try:
A()
except Exception as e:
tb_info = traceback.format_exc()
print(tb_info)
"""
Traceback (most recent call last):
File "C:/Users/EDZ/Desktop/satori/wtfpython/1.py", line 16, in <module>
A()
File "C:/Users/EDZ/Desktop/satori/wtfpython/1.py", line 12, in A
B()
File "C:/Users/EDZ/Desktop/satori/wtfpython/1.py", line 9, in B
C()
File "C:/Users/EDZ/Desktop/satori/wtfpython/1.py", line 6, in C
1 / 0
ZeroDivisionError: division by zero
"""
traceback:让你更加灵活地处理python的异常的更多相关文章
- Python 处理异常栈模块——traceback 模块
异常捕捉 通常我们在项目中,针对异常的捕捉会使用 try + except,基本形式如下: try: # 主代码 except IndexError as e: # 索引异常时执行这里 logger. ...
- python 的异常及其处理
Python 异常处理 python提供了两个非常重要的功能来处理python程序在运行中出现的异常和错误.你可以使用该功能来调试python程序. 异常处理: 本站Python教程会具体介绍. 断言 ...
- Python中异常(Exception)的总结
Python中的异常处理 异常处理的语句结构 try: <statements> #运行try语句块,并试图捕获异常 except <name1>: <statement ...
- Python标准异常和异常处理详解
python提供了两个非常重要的功能来处理python程序在运行中出现的异常和错误.你可以使用该功能来调试python程序. 1.异常处理: 本站Python教程会具体介绍. 2.断言(Asserti ...
- 从JavaScript到Python之异常
不少前端工程师看到这个标题可能会产生质问: 我js用得好好的,能后端能APP,为什么还要学习Python? 至少有下面两个理由: 学习曲线.ES6之后的JavaScript(TypeScript)的在 ...
- python 17 异常
自 http://www.cnblogs.com/BeginMan/p/3171445.html 一.什么是错误,什么是异常,它们两者区别 这里解释如下:个人觉得很通俗易懂 错误是指在执行代码过程中发 ...
- Python标准异常topic
Python标准异常topic AssertionError 断言语句 (assert) ...
- Python 6 —— 异常
Python 6 —— 异常 异常分类 AttributeError:调用不存在的方法 EOFError:遇到文件末尾引发异常 ImportError:导入模块引发异常 IndexError:列表越界 ...
- Python标准异常总结
Python标准异常总结 AssertionError 断言语句(assert)失败 AttributeError 尝试访问未知的对象属性 EOFError 用户输入文件末尾标志EOF(Ctrl+d ...
随机推荐
- ip地址后面的斜杠24
ip地址后面的斜杠24表示掩码位是24位的,即用32位二进制表示的子网掩码中有连续的24个“1”:11111111 11111111 11111111 00000000,将其转化为十进制,就是:255 ...
- Linux 部署 Django 系统
一:安装uwsgi pip3 install uwsgi 二:进入项目目录下,创建uwsgi.ini配置文件 [uwsgi] # 使用nginx连接时使用功能,上线时才使用socket,指定项目执行的 ...
- CnPack 开源软件项目
Cnpack公共窗体库 ------------------------------ CnPack 2009-09-14 SVN 包,包括以下内容: 1. CnPack 组件包所有源代码.2. CnP ...
- Xcode真机报错clang: error: linker command failed with exit code 1 (use -v to see invocation)
出现这种错误,如下图所示,搜索bitcode,置为NO即可.
- iOS源码学习总结框架
1.ARChromeActivity: 用于在Google Chrome中打开网址的UIActivity子类. 2.KINWebBrowser: 它使用iOS 8的 WKWebView API编写,同 ...
- jdk1.8-Vector
一:先看下类的继承关系 UML图如下: 继承关系: ))) ))) grow(minCapacity)) ? ) newCapacity = minCapacity) ) , elementData, ...
- 数据库中TOP—N查询
1)查询1-4的数据 SELECT rownum, sno, cno, score FROM (SELECT * FROM sc order by score desc) WHERE rownum & ...
- python-爬虫-selenium和phantomJs
1.selenum:三方库.可以实现让浏览器完成自动化的操作. 2.环境搭建 2.1 安装:pip install selenium 2.2 获取浏览器的驱动程序 下载地址: http://chrom ...
- python模块hashlib & hmac
Hash,译做“散列”,也有直接音译为“哈希”的.把任意长度的输入,通过某种hash算法,变换成固定长度的输出,该输出就是散列值,也称摘要值.该算法就是哈希函数,也称摘要函数. MD5是最常见的摘要算 ...
- shell脚本之nginx启动脚本、统计日志字段、for循环实战、跳板机
1.NGINX启动脚本 #!/bin/bash # chkconfig: 235 32 62 # description: nginx [ -f /etc/init.d/functions ] &am ...