Python异常处理-traceback和exc_info

开发过程中一般都会使用traceback将捕获到的异常打印出来。

import traceback

def fake_exception():
    1 / 0

def catch_exception():
    try:
        fake_exception()
    except:
        traceback.print_exc()

catch_exception()

结果

Traceback (most recent call last):
  File ".\test.py", line 9, in catch_exception
    fake_exception()
  File ".\test.py", line 5, in fake_exception
    1 / 0
ZeroDivisionError: integer division or modulo by zero

事实上,traceback里的所有信息都是从exc_info里面获取的。
traceback.print_exc([limit[, file]])
In fact, it uses sys.exc_info() to retrieve the same information in a thread-safe way instead of using the deprecated variables.

那么我们再来看一下exc_info()这个方法。
https://docs.python.org/2/library/sys.html?highlight=sys#module-sys
该方法返回三个值:type, value, traceback.

  • type (异常类别)
    get the exception type of the exception being handled (a class object)
  • value (异常说明,可带参数)
    get the exception parameter (a class instance)
  • traceback (traceback对象,包含更丰富的信息)
    get a traceback object which encapsulates the call stack at the point where the exception originally occurred (a traceback object)

其中traceback中还包含了更为丰富的信息,比如文件名,行号等等。如果觉得系统默认的traceback打印格式不好看的话,可以利用exc_info的返回值自定义格式。

import sys

def fake_exception():
    1 / 0

def catch_exception():
    try:
        fake_exception()
    except:
        e_type, e_value, e_traceback = sys.exc_info()
        print "type ==> %s" % (e_type.__name__)
        print "value ==> %s" %(e_value.message)
        print "traceback ==> file name: %s" %(e_traceback.tb_frame.f_code.co_filename)
        print "traceback ==> line no: %s" %(e_traceback.tb_lineno)
        print "traceback ==> function name: %s" %(e_traceback.tb_frame.f_code.co_name)

catch_exception()

结果显示

type ==> typename: ZeroDivisionError
value ==> message: integer division or modulo by zero
traceback ==> fielname: .\test.py
traceback ==> lineno: 8
traceback ==> name: catch_exception
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转载自:JmilkFan_范桂飓:http://blog.csdn.net/jmilk 异常 异常即非正常状态,在...
    ccq_inori阅读 3,753评论 0 1
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,032评论 19 139
  • contextlib — Context Manager Utilities contextlib - 上下文管理...
    英武阅读 2,887评论 0 52
  • 北京有胡同,上海有弄堂,都是具有城市代表性的地方,虽然上海建了很多高楼大厦,倒是依然在城市中间会有一些小弄堂。 哪...
    柠绾绾阅读 469评论 2 1
  • 晓色穿深树,过冬似返春。 朝日出山海,栉云如锦鳞。 冲霄排字燕,疾步借风人。 辞夜先灯睡,负昏不负晨。
    平生恨阅读 390评论 1 2