异常

异常在python中是屡见不鲜了,程序在执行到某一行代码时,发现有问题,比如数组索引越界,变量没有定义啊等等,此时就会抛出异常

捕获异常

在python,一般都是使用try···except来对异常进行捕获

python

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对象

python

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) #

print(exc_value) # division by zero

print(exc_tb) #

可以看到,sys.exc_info()获取了当前处理的exception的相关信息,并返回一个元组。元组的第一个元素是异常的类型,第二个元素是异常的value值,第三个异常信息则是traceback object。print(e)打印的是异常的值。

有了traceback object我们则可以打印和格式化traceback的相关信息

traceback模块

print_tb

接收一个tracebackobject

python

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

1 / 0

"""

# 如果我们不捕获异常看看输出啥?

"""

Traceback (most recent call last):

File "C:/Users/EDZ/Desktop/satori/wtfpython/1.py", line 6, in

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也就是不指定,那么会打印所有层级

python

import sys

import traceback

defC():

1 / 0

defB():

C()

defA():

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

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

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时,会有"^"来指示语法错误的位置

python

import sys

import traceback

defC():

1 / 0

defB():

C()

defA():

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

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返回的三个值,而是会自动帮我们调用

python

import sys

import traceback

defC():

1 / 0

defB():

C()

defA():

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

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一样,只不过是以字符串的形式返回,需要我们自己手动打印

python

import sys

import traceback

defC():

1 / 0

defB():

C()

defA():

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

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

"""

python traceback class_traceback:让你更加灵活地处理python的异常相关推荐

  1. Python traceback 模块, 打印异常信息

    Python traceback 模块, 打印异常信息 参考文章: (1)Python traceback 模块, 打印异常信息 (2)https://www.cnblogs.com/xudong-b ...

  2. python traceback 丢失_基于python traceback实现异常的获取与处理

    这篇文章主要介绍了基于python traceback实现异常的获取与处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.traceback.p ...

  3. python优点是代码库支持、灵活_C++和Python混合编程的利器

    Python是一种简单易学.功能强大的编程语言,它有高效率的高层数据结构,能简单而有效地实现面向对象编程.Python简洁的语法.对动态输入的支持和解释性语言的本质,使得它在很多领域的大多数平台上都是 ...

  4. 问题:Traceback (most recent call last): File “D:/xiangmu/python/test/test1.py“, line 100, in <module

    问题:2020-8-25 Traceback (most recent call last): File "D:/xiangmu/python/test/test1.py", li ...

  5. python traceback报错_python3 使用traceback定位异常实例

    1.我们使用正常的输出语句 得到的是(输出结果:division by zero)虽然得到了错误的日志输出,但是不知道为什么出错,也不能定位具体出错位置. 2.现在我们使用 traceback 就可以 ...

  6. python traceback 丢失_Python异常模块traceback用法实例分析

    本文实例讲述了python异常模块traceback用法.分享给大家供大家参考,具体如下: traceback模块被用来跟踪异常返回信息. 如下例所示: import traceback try: r ...

  7. python traceback安装_python之traceback

    traceback 模块允许你在程序里打印异常的跟踪返回 (Traceback)信息 1.1 traceback.print_exc() File: traceback-example-1.py # ...

  8. 史上最全Python学习笔记(基于《Python学习手册(第4版)》)——Part7 异常和工具

    文章目录 Chap32 异常基础 为什么使用异常 异常的角色 异常处理:简明扼要 默认异常处理器 捕获异常 引发异常 用户定义的异常 终止行为 Chap33 异常编码细节 try/except/els ...

  9. 深入浅出 Python 装饰器:16 步轻松搞定 Python 装饰器

    2019独角兽企业重金招聘Python工程师标准>>> Python的装饰器的英文名叫Decorator,当你看到这个英文名的时候,你可能会把其跟Design Pattern里的De ...

最新文章

  1. CFA考试一二三级经验,我写的很仔细......
  2. 2.1.1 进位计数制
  3. Android使用ConstraintLayout 加载RecyclerView数据显示不全
  4. 服务器的虚拟主机用途,服务器的虚拟主机用途
  5. 自学成为动画师?你真的准备好了吗?
  6. 【白皮书分享】2020智能体白皮书-华为.pdf(附下载链接)
  7. 除权除息对散户是利好还是不利好?
  8. 《phrack》黑客杂志
  9. 【复杂网络】当机器学习遇上复杂网络:解析微信朋友圈 Lookalike 算法
  10. 使用getdate()获取不同格式的日期
  11. 计算机开机无自检声音,电脑启动不了,开机无自检声音,显示器不亮
  12. Linux创建用户密码修改
  13. 全屏功能-实现全屏-图标切换
  14. IFS系统功能清单之三——IFS成本核算
  15. 0910---scipy.signal.argrelextrema 计算多维数组局部极值问题
  16. 韩:已撤销慰安妇财团法人资格 将启动清算程序
  17. 微信jssdk已无力吐槽
  18. python爬虫爬取(中国空气质量在线监测分析平台)北京PM2.5,2013年至2018年的数据
  19. Live555: RtspServer 示例
  20. 热烈祝贺2011年7月当选微软MVP的CSDN会员!

热门文章

  1. session多服务器共享的方案梳理
  2. Linux运维人员的前生后世!
  3. 配置FTP服务-要点总结
  4. 剔除异常值栅格计算器_R语言系列 数据清洗3 异常值处理
  5. golang的基本数据类型和数组默认都是值传递的
  6. docker配置数据默认存储路径:--graph已过时,新版本中使用--data-root代替
  7. maven工程中添加scala-library并非idea scala插件
  8. 巨鲸任务调度平台:spark flink任务调度
  9. spark mapreduce术语梳理
  10. maven快照版本机制详解