【python】用traceback获取异常栈,格式化输出异常

一、实现方式

test.py

#encoding:utf-8

import sys
import traceback

def testerr():
	testerr2()

def testerr2():
	a = "test"
	b = 123
	print(c)	#不存在的变量,触发个异常
	
try:
	testerr()
except Exception as e:
	exc_type, exc_value, exc_traceback = sys.exc_info()
	frame = traceback.extract_tb(exc_traceback) #返回一个异常栈的FrameSummary对象
	#格式化成字符串输出
	mapStack = map(str, frame)
	sErrorStack = "\n".join(mapStack)
	#也可以直接用traceback.format_exc()获取栈字符串
	print("异常栈:")
	print(sErrorStack)
	#输出异常原因
	print(repr(e))
	#输出报错函数的局部变量
	lasttb = None
	while exc_traceback:
		lasttb = exc_traceback
		exc_traceback = exc_traceback.tb_next
	print("局部变量:")
	print(lasttb.tb_frame.f_locals)

输出结果:

异常栈:
<FrameSummary file c:\Users\Admin\Desktop\test.py, line 15 in >
<FrameSummary file c:\Users\Admin\Desktop\test.py, line 7 in testerr>
<FrameSummary file c:\Users\Admin\Desktop\test.py, line 12 in testerr2>
NameError(“name ‘c’ is not defined”)
局部变量:
{‘a’: ‘test’, ‘b’: 123}

二、装饰器版本

from functools import wraps

import sys
import traceback

def FormatError(func):
	@wraps(func)
	def Format(*args, **kwargs):
		try:
			func(*args, **kwargs)
		except Exception as e:
			exc_type, exc_value, exc_traceback = sys.exc_info()
			frame = traceback.extract_tb(exc_traceback) #返回一个异常栈的FrameSummary对象
			#格式化成字符串输出
			mapStack = map(str, frame)
			sErrorStack = "\n".join(mapStack)
			print("异常栈:")
			print(sErrorStack)
			#输出异常原因
			print(repr(e))
			#输出报错函数的局部变量
			lasttb = None
			while exc_traceback:
				lasttb = exc_traceback
				exc_traceback = exc_traceback.tb_next
			print("局部变量:")
			print(lasttb.tb_frame.f_locals)
	return Format

@FormatError	
def testerr():
	testerr2()

def testerr2():
	a = "test"
	b = 123
	print(c)	#不存在的变量,触发个异常

testerr()

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值