捕捉traceback異常棧資訊
by:授客 QQ:1033553122
相關函數簡介
sys.exc_info()
傳回包含3個元素(type, value, traceback)的元組,提供關于目前正被處理的異常資訊。如果異常沒有被處理,傳回包含3個None值的元組。
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
作者:授客
QQ:1033553122
全國軟體測試QQ交流群:7156436
Git位址:https://gitee.com/ishouke
友情提示:限于時間倉促,文中可能存在錯誤,歡迎指正、評論!
作者五行缺錢,如果覺得文章對您有幫助,請掃描下邊的二維碼打賞作者,金額随意,您的支援将是我繼續創作的源動力,打賞後如有任何疑問,請聯系我!!!
微信打賞
支付寶打賞 全國軟體測試交流QQ群
