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 ...
随机推荐
- 数据中心网络架构的问题与演进 — CLOS 网络与 Fat-Tree、Spine-Leaf 架构
目录 文章目录 目录 前文列表 CLOS Networking Switch Fabric 胖树(Fat-Tree)型网络架构 Fat-Tree 拓扑示例 Fat-Tree 的缺陷 叶脊(Spine- ...
- pyqt5 工具栏文字图片同时显示
import sys from PyQt5.QtWidgets import QMainWindow, QTextEdit, QAction, QApplication from PyQt5.QtGu ...
- jenkins介绍及其简单操作
一.jenkins简介 Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能. Jenkins功能包 ...
- linux常用命令(18)find exec
find是我们很常用的一个Linux命令,但是我们一般查找出来的并不仅仅是看看而已,还会有进一步的操作,这个时候exec的作用就显现出来了.-exec 参数后面跟的是command命令,它的终止是以 ...
- Web测试方法_02
1.页面链接检查 检查每一个链接是否都有对应的页面,页面与页面之间的来回切换是否正常响应,包括一些返回页面的链接是否正常,还要检查点击图片所链接的页面是否准确展示. 2.相关性检查 功能相关性检查:例 ...
- 01vscode配置git
一.准备工作 必须保证已安装git,相关安装git的教程很多,这里就不进行描述. 通过命令:git --version 查看git版本. 二.git config 配置 通过git config 配置 ...
- B/S结构-登录页面-测试用例设计
页面描述: 有一个登陆页面, 假如上面有2个textbox, 一个提交按钮 测试需求: 请针对这个页面设计30个以上的testcase 功能测试(Function test) 0. 什么都不输入,点击 ...
- CentOS 7 替换网易yum 源
首先备份/etc/yum.repos.d/CentOS-Base.repo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-B ...
- Linux C\C++基础 字符数组、字符串和字符串常量
1.字符数组和字符串 C语言没有字符串类型,用字符数组模拟 字符串一定是字符数组,字符数组不一定是字符串 如果字符数组以字符'\0'('\0'等同与数字0)结尾,那么这个字符数组就是字符串 char ...
- nginx加php(三) 启动脚本
不用nginx默认的方式启动nginx start_web.sh #!/bin/bash USE_FPM=1USE_HHVM=0ulimit -HSn 60000 if [ "$USE_FP ...