浅谈浅谈Python traceback的优雅处理的优雅处理
刚接触Python的时候,简单的异常处理已经可以帮助我们解决大多数问题,但是随着逐渐地深入,我们会发现有很多情况下
简单的异常处理已经无法解决问题了,如下代码,单纯的打印异常所能提供的信息会非常有限。
def func1():
raise Exception("--func1 exception--")
def main():
try:
func1()
except Exception as e:
print e
if __name__ == '__main__':
main()
执行后输出如下:
–func1 exception–
通过示例,我们发现普通的打印异常只有很少量的信息(通常是异常的value值),这种情况下我们很难定位在哪块代码出的
问题,以及如何出现这种异常。那么到底要如何打印更加详细的信息呢?下面我们就来一一介绍。
sys.exc_info和和traceback object
Python程序的traceback信息均来源于一个叫做traceback object的对象,而这个traceback object通常是通过函数
sys.exc_info()来获取的,先来看一个例子:
import sys
def func1():
raise NameError("--func1 exception--")
def main():
try:
func1()
except Exception as e:
exc_type, exc_value, exc_traceback_obj = sys.exc_info()
print "exc_type: %s" % exc_type
print "exc_value: %s" % exc_value
print "exc_traceback_obj: %s" % exc_traceback_obj
if __name__ == '__main__':
main()
执行后输出如下:
exc_type: <type ‘exceptions.NameError’>
exc_value: –func1 exception–
exc_traceback_obj: <traceback object at 0x7faddf5d93b0>
通过以上示例我们可以看出,sys.exc_info()获取了当前处理的exception的相关信息,并返回一个元组,元组的第一个数据是
异常的类型(示例是NameError类型),第二个返回值是异常的value值,第三个就是我们要的traceback object.
有了traceback object我们就可以通过traceback module来打印和格式化traceback的相关信息,下面我们就来看下traceback
module的相关函数。
traceback module
Python的traceback module提供一整套接口用于提取,格式化和打印Python程序的stack traces信息,下面我们通过例子来详
细了解下这些接口:
print_tb
import sys
import traceback
def func1():
raise NameError("--func1 exception--")
def main():
try: