首页 > 编程 > Python > 正文

浅谈Python traceback的优雅处理

2020-02-15 22:52:14
字体:
来源:转载
供稿:网友

刚接触Python的时候,简单的异常处理已经可以帮助我们解决大多数问题,但是随着逐渐地深入,我们会发现有很多情况下简单的异常处理已经无法解决问题了,如下代码,单纯的打印异常所能提供的信息会非常有限。

def func1():  raise Exception("--func1 exception--")def main():  try:    func1()  except Exception as e:    print eif __name__ == '__main__':  main()

执行后输出如下:

--func1 exception--

通过示例,我们发现普通的打印异常只有很少量的信息(通常是异常的value值),这种情况下我们很难定位在哪块代码出的问题,以及如何出现这种异常。那么到底要如何打印更加详细的信息呢?下面我们就来一一介绍。

sys.exc_info和traceback object

Python程序的traceback信息均来源于一个叫做traceback object的对象,而这个traceback object通常是通过函数sys.exc_info()来获取的,先来看一个例子:

import sysdef 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_objif __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 sysimport tracebackdef func1():  raise NameError("--func1 exception--")def main():  try:    func1()  except Exception as e:    exc_type, exc_value, exc_traceback_obj = sys.exc_info()    traceback.print_tb(exc_traceback_obj)if __name__ == '__main__':  main()

输出:

File "<ipython-input-23-52bdf2c9489c>", line 11, in main
    func1()
File "<ipython-input-23-52bdf2c9489c>", line 6, in func1
    raise NameError("--func1 exception--")

这里我们可以发现打印的异常信息更加详细了,下面我们了解下print_tb的详细信息:

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表