天天看點

Python 捕捉traceback異常棧資訊

捕捉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群  

Python 捕捉traceback異常棧資訊
Python 捕捉traceback異常棧資訊
Python 捕捉traceback異常棧資訊