Python 捕捉traceback异常栈信息

捕捉traceback异常栈信息

 

by:授客 QQ1033553122

相关函数简介

sys.exc_info()

返回包含3个元素(type, value, traceback)的元组,提供关于当前正被处理的异常信息。如果异常没有被处理,返回包含3None值的元组。

 

type:存放异常类型(类对象);

 

Value:获取异常参数(关联的值,或者需要抛出的第二个参数--总是异常类型是个类对象,那该参数总是一个异常类实例)its associated value or the second argument to raise, which is always a class instance if the exception type is a class object)

 

traceback:获取traceback对象,记录异常发生点(根源)

 

注意:把traceback值赋值给正在处理当前异常的函数中的本地变量,会引发循环引用问题,会影响垃圾回收。用完后需要删除。

参考连接:

https://docs.python.org/2/library/sys.html#sys.exc_info

 

traceback.extract_stack()

stack frame提取原始的traceback

 

参考连接:

https://hg.python.org/cpython/file/8dffb76faacc/Lib/traceback.py#l280

 

代码演示

#!/usr/bin/env python
# -*- coding:utf-8 -*-
 
__author__ = 'shouke'
 
import  sys
import traceback
 
def testfn():
# 定义异常信息模版
traceback_template = '''Traceback (most recent call last):
         File "%(filename)s", line %(lineno)s, in %(name)s
     %(type)s: %(message)s\n'''
 
try:
var = 5
assert var >0, 'var is larger than zero'
assert var % 2 == 0, 'var is not an even number'
except AssertionError:
        exc_type, exc_value, exc_traceback = sys.exc_info()
 
print('异常类型:', exc_type)
print('关联的值,或者需要raise的第二个参数:', exc_value)
print('异常发生点(根源)', exc_traceback)
 
 
print('--------------------------')
        traceback_details = {
'filename': exc_traceback.tb_frame.f_code.co_filename, #文件名
'lineno' : exc_traceback.tb_lineno, # 发生异常的行数
'name'  : exc_traceback.tb_frame.f_code.co_name, # 所在函数
'type'  : exc_type.__name__, # 异常类型
'message' : exc_value 
        }
 
        traceback_info = traceback_template % traceback_details
print(traceback_info)
 
print('--------------------------')
        raw_traceback = traceback.extract_stack()
print(raw_traceback)
 
finally: # 为避免垃圾回收问题需要删除
del (exc_type, exc_value, exc_traceback)
 
testfn()
 

运行结果

"D:\Program Files\python33\python.exe" E:/Projects/interface_project_for_dev/teststudy.py
异常类型:
关联的值,或者需要raise的第二个参数: var is not an even number
异常发生点(根源)
--------------------------
Traceback (most recent call last):
     File "E:/Projects/interface_project_for_dev/teststudy.py", line 17, in testfn
     AssertionError: var is not an even number
 
--------------------------
[('E:/Projects/interface_project_for_dev/teststudy.py', 44, '', 'testfn()'), ('E:/Projects/interface_project_for_dev/teststudy.py', 39, 'testfn', 'raw_traceback = traceback.extract_stack()')]
 
Process finished with exit code 0

转载于:https://www.cnblogs.com/shouke/p/10157616.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值