异常

异常在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的异常的更多相关文章

  1. Python 处理异常栈模块——traceback 模块

    异常捕捉 通常我们在项目中,针对异常的捕捉会使用 try + except,基本形式如下: try: # 主代码 except IndexError as e: # 索引异常时执行这里 logger. ...

  2. python 的异常及其处理

    Python 异常处理 python提供了两个非常重要的功能来处理python程序在运行中出现的异常和错误.你可以使用该功能来调试python程序. 异常处理: 本站Python教程会具体介绍. 断言 ...

  3. Python中异常(Exception)的总结

    Python中的异常处理 异常处理的语句结构 try: <statements> #运行try语句块,并试图捕获异常 except <name1>: <statement ...

  4. Python标准异常和异常处理详解

    python提供了两个非常重要的功能来处理python程序在运行中出现的异常和错误.你可以使用该功能来调试python程序. 1.异常处理: 本站Python教程会具体介绍. 2.断言(Asserti ...

  5. 从JavaScript到Python之异常

    不少前端工程师看到这个标题可能会产生质问: 我js用得好好的,能后端能APP,为什么还要学习Python? 至少有下面两个理由: 学习曲线.ES6之后的JavaScript(TypeScript)的在 ...

  6. python 17 异常

    自 http://www.cnblogs.com/BeginMan/p/3171445.html 一.什么是错误,什么是异常,它们两者区别 这里解释如下:个人觉得很通俗易懂 错误是指在执行代码过程中发 ...

  7. Python标准异常topic

    Python标准异常topic AssertionError                            断言语句 (assert)                              ...

  8. Python 6 —— 异常

    Python 6 —— 异常 异常分类 AttributeError:调用不存在的方法 EOFError:遇到文件末尾引发异常 ImportError:导入模块引发异常 IndexError:列表越界 ...

  9. Python标准异常总结

    Python标准异常总结 AssertionError 断言语句(assert)失败 AttributeError 尝试访问未知的对象属性  EOFError 用户输入文件末尾标志EOF(Ctrl+d ...

随机推荐

  1. Transfer 穿梭框

    基础用法 Transfer 的数据通过 data 属性传入.数据需要是一个对象数组,每个对象有以下属性:key 为数据的唯一性标识,label为显示文本,disabled 表示该项数据是否禁止转移.目 ...

  2. 在mac下安装fiddler

    说明:学习fiddler好久了,一直以来也没形成文档,之前学的一些知识也快忘得差不多了:正好利用假期,把之前学的知识都捡起来,捋一遍,形成文档,供以后使用的时候参考和借鉴 一:下载Mono 因为fid ...

  3. linux中配置双网卡的目的?如何实现双网卡绑定,以实现负载均衡?

    配置双网卡的目的:========================== 1.你想做路由器,网关 2.实现冗余 3.负载均衡     linux 主机安装双网卡,共享一个IP地址,对外提供访问,实际 同 ...

  4. 【Python开发】python集成开发环境IDE搭建

    http://blog.csdn.net/pipisorry/article/details/39854707 使用的系统及软件 Ubuntu / windows Python 2.7 / pytho ...

  5. mysql——创建表、修改表、删除表(概念详细讲解)

    一.创建一个数据表 create table 表名 ( 列名1 数据类型1 [完整性约束条件], 列名2 数据类型2 [完整性约束条件], 列名3 数据类型3 [完整性约束条件], 列名4 数据类型4 ...

  6. 再谈MV*(MVVM MVP MVC)模式的设计原理—封装与解耦

    精炼并增补于:界面之下:还原真实的MV*模式 图形界面的应用程序提供给用户可视化的操作界面,这个界面提供给数据和信息.用户输入行为(键盘,鼠标等)会执行一些应用逻辑,应用逻辑(application ...

  7. Object中有哪些方法及其作用

    你知道Object中有哪些方法及其作用吗? 一.引言 二.Object方法详解 1.1.registerNatives() 1.2.getClass() 1.2.1.反射三种方式: 1.3.hashC ...

  8. Python全栈开发之3、深浅拷贝、变量和函数、递归、函数式编程、内置函数

    一.深浅拷贝 1.数字和字符串 对于 数字 和 字符串 而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. import copy # 定义变量 数字.字符串 # n1 = 123 n1 ...

  9. [转帖]ORA-00600: internal error code, arguments: [4193]问题解决

    ORA-00600: internal error code, arguments: [4193]问题解决 https://www.cnblogs.com/linyfeng/p/7496736.htm ...

  10. IIS 404设置

    想给自己做的的网站自定义一个404页面,开始 双击红框提示的错误页图标 双击上图红框提示的所示404行 修改上图红框提示的内容如下:我是直接在根目录放了一个自己做的404.html,实际情况要填写你自 ...