1. 程式人生 > >python之追溯函式呼叫及錯誤日誌詳細列印

python之追溯函式呼叫及錯誤日誌詳細列印

目錄

一、函式呼叫追溯

1.1 原因

        在列印日誌時,為實現日誌分層列印,將列印日誌的語句封裝到了print_log_info以及print_log_error中。但是如果在上述函式中直接通過logger.*列印日誌,日誌中的模組名、行號就會一直列印print_log_info和print_log_error函式中的logger.*中的位置。所以有了追溯函式呼叫的想法,在列印正常日誌時,列印對應模組名以及列印日誌語句的行號。

1.2 使用例項

2.2.1 追溯函式呼叫推導

        在一個模組中呼叫print_log_info函式,在print_log_info函式中呼叫了trace_caller函式,trace_caller函式定義如下:

import inspect

def trace_caller(laynum):
    cur_func_name = inspect.currentframe()
    cur_func_name = inspect.getouterframes(cur_func_name, 2)
    print(cur_func_name)

列印結果如下:

[(<frame object at 0x04DC2B70>, 'C:\\Users\\Think\\PycharmProjects\\InterfaceFrame\\src\\utils\\utils.py', 19, 'trace_caller'
, [' cur_func_name = inspect.currentframe()\n', ' cur_func_name = inspect.getouterframes(cur_func_name, 2)\n'], 1), (<frame object at 0x04DD5380>, 'C:\\Users\\Think\\PycharmProjects\\InterfaceFrame\\src\\utils\\utils.py', 62, 'print_log_info', [' print(msg) # 在HTMLTestRunner列印測試報告,用例執行成功,不可能觸發斷言,所以需要列印msg\n'
, ' caller_module, msg_lineno = trace_caller(2)\n'], 1), (<frame object at 0x04B0C6B0>, 'C:/Users/Think/PycharmProjects/InterfaceFrame/src/InterfaceTest.py', 18, '<module>', ['\n', ' utils.print_log_info("最後呼叫tracecall函式")\n'], 1)]

        可以看到列印結果是一個列表,列表中的元素是三個元組,我們重點從每個元素的第2個元素開始關注,發現分別是呼叫print(cur_func_name)以及上一級呼叫語句的模組所在路徑、程式碼行數、函式名、以及列印語句。所以我們根據需要取cur_func_name 對應元素的值就可以達到我們想要的效果了。

1.2.2 程式碼示例

def trace_caller(laynum):
    '''
    根據傳遞的laynum追溯函式呼叫者所在的模組、行數。目前只能在列印日誌函式中使用
    :param laynum:追溯層數,由於在列印日誌函式中呼叫本函式,追溯層數為2,
    :return:模組名, 列印日誌所在行號
    '''
    cur_func_name = inspect.currentframe()
    cur_func_name = inspect.getouterframes(cur_func_name, 2)
    caller_module = cur_func_name[laynum][1][len(settings.PROJECT_DIR)+1:]
    msg_lineno = cur_func_name[laynum][2]
    return caller_module, msg_lineno

二、錯誤詳細的日誌資訊列印

        通過上述方式,可以追溯到函式的呼叫過程,但最多隻能追溯到列印日誌的logger.info()等語句。如果想要打印出錯行的程式碼,就需要再採用其他方式了。也就是traceback模組

2.1 traceback模組介紹

        使用traceback模組,可以實現對出錯日誌的詳細輸出,但是需要結合try except語句來使用,單獨使用會報錯。使用案例如下:

class TestExample(unittest.TestCase):
    def test_add(self):
        result = Test(2, 2).add()
        try:
            self.assertEqual(result, 3, "加法錯誤,請重新輸入")
            utils.print_log_info("測試成功")
        except AssertionError as err:
            err_str = traceback.format_exc()
            utils.print_log_error(err_str)
            raise err

列印日誌

2018-04-25 Wednesday 21:48:47 - ERROR -MainThread:42464 - src\test\case\testExample.py : 16     Traceback (most recent call last):
  File "C:\Users\Think\PycharmProjects\InterfaceFrame\src\test\case\testExample.py", line 12, in test_add
    self.assertEqual(result, 3, "加法錯誤,請重新輸入")
  File "C:\Python33\lib\unittest\case.py", line 641, in assertEqual
    assertion_func(first, second, msg=msg)
  File "C:\Python33\lib\unittest\case.py", line 634, in _baseAssertEqual
    raise self.failureException(msg)
AssertionError: 4 != 3 : 加法錯誤,請重新輸入

相關推薦

python追溯函式呼叫錯誤日誌詳細列印

目錄 一、函式呼叫追溯 1.1 原因         在列印日誌時,為實現日誌分層列印,將列印日誌的語句封裝到了print_log_info以及print_log_error中。但是如果在上述函式中直接通過logger.*列印日誌,日誌中的模

python預設函式字典)

#coding:utf-8 def selfAdd(a): a = a + a return a #返回 def selfAdd1(a): a += a a_list = [

what's the python基本運算符字符串、列表、元祖、集合、字典的內置方法

back 原理 pop mat 要點 log 程序 eric none   計算機可以進行的運算有很多種,運算按種類可分為算數運算、比較運算、邏輯運算、賦值運算、成員運算、身份運算。字符串和列表的算數運算只能用+和*,字典沒有順序,所以不能進行算數運算和比較運算。比較運算中

Python叠代器生成器

滿足 subclass 毛線 總結 繼續 異常處理 instance 好處 應該 一. 叠代器 1.1 什麽是可叠代對象 字符串、列表、元組、字典、集合 都可以被for循環,說明他們都是可叠代的。 我們怎麽來證明這一點呢? from collections im

pythonpandas簡單介紹使用(一)

dad all 就會 能夠 簡單的 兩種 first 模型 自己 python之pandas簡單介紹及使用(一) 一、  Pandas簡介1、Python Data Analysis Library 或 pandas 是基於NumPy 的一種工具,該工具是為了解決數據分析任

pythonexec執行檔案解碼錯誤

這是原始碼: print(2**100) x=‘Spam’ print(x*8) exec(open(‘script1.py’).read()) 報錯 exec(open(‘script1.py’).read()

學渣學pythonmap函式

map()函式是Python內建的高階函式,它接收一個函式f和一個list,並把函式f作用在list的每個元素上。從而得到一個f處理過的新的list返回。下面舉個栗子: 1. 例1 list [1, 2, 3, 4, 5, 6, 7] 我們要得到list的每個元素都平方後的,新的li

Vue 進階系列(三)Render函式原理實現

Vue進階系列彙總如下,歡迎閱讀,歡迎加高階前端進階群一起學習(文末)。 Vue 進階系列(一)之響應式原理及實現 Vue 進階系列(二)之外掛原理及實現 Render函式原理 根據第一篇文章介紹的響應式原理,如下圖所示。 在初始化階段,本質上發生在auto run函式中,然後通過r

跟老齊學Python私有函式和專有方法

在任何語言中,都會規定某些物件(屬性、方法、函式、類等)只能夠在某個範圍內訪問,出了這個範圍就不能訪問了。這是“公”、“私”之分。此外,還會專門為某些特殊的東西指定一些特殊表示,比如類的名字就不能用class,def等,這就是保留字。除了保留字,python中還為類的名字做了某些特殊準備,就是“專有

cassandracopy遷移資料錯誤排查

文章目錄 一、copy遷移資料: 二、錯誤排查 一、copy遷移資料: copy匯出資料 #!/bin/bash for kspname in {xn_dolphin

使用 python指令碼獲取函式呼叫關係

        函式關係調用圖可使用TestBed或者Source Insight軟體生成。本文工具所提取的函式呼叫關係,是為了方便編寫詳細設計文件,自動將該函式所有呼叫的函式列舉出來。 首先上傳程式碼流程圖: 程式碼的第一部分是

U3D進階 | 常用 API Invoke 函式呼叫

金錢副本細節完善 寶箱掉落 給寶箱預製體新增剛體元件即可。 實現按鍵寶箱批量掉落 將例項化生成寶箱的程式碼單獨封裝成一個函式; 使用 for 迴圈,批量生成寶箱。 寶箱自動掉落 現在我們是通過按鍵,程式呼叫 “生成寶箱” 的函式來實現功能。在遊戲中,

vue 父子之間函式呼叫引數接收

1.子元件呼叫父元件函式 在父元件裡面進行定於函式 export default { provide(){ return { reload:this.reload,

pythonrange函式

函式原型:range(start, end, scan): 引數含義:start:計數從start開始。預設是從0開始。例如range(5)等價於range(0, 5);               end:計數到en

c++ math函式以及出現錯誤,修改

math.h 數學函式庫,一些數學計算的公式的具體實現是放在math.h裡,具體有: 1 三角函式 double sin (double); double cos (double); double tan (double); 2 反三角函式 double asin (doub

python檔案批量更名檔名批量儲存

          如果self.savefilenameformat輸入為空的情況下,將資料夾中的檔名下入txt文字以及其他型別文件中,在這裡有兩種選擇模式,預設self.choosefilenameformat=2是把當前資料夾中的檔案的檔名下入文件中,模式self.ch

記錄一個詭異的函式呼叫返回錯誤的指標bug

//main.c#include "test.h" void main(){ S* s = get_struct_s(); printf("%s\n",s->name); return 0; }//test.h typedef struct S_

python路-----函式

文章目錄 語法定義 預設引數 **非固定引數** *args 會把多傳入的引數變成一個元組形式 **kwargs 會把多傳入的引數變成一個dict形式 匿名函式 lambda 高階函式 關鍵引數

Pythonisinstance() 函式判斷資料型別

isinstance isinstance(object, classinfo) 判斷例項是否是這個類或者object是變數 classinfo 是型別(tuple,dict,int,float) 判斷變數是否是這個型別 class objA: pass A

Python內建函式總結詳解

………………吧啦吧啦……………… 2個多月來,將3.5版本中的68個內建函式,按順序逐個進行了自認為詳細的解析。為了方便記憶,將這些內建函式進行了如下分類: 數學運算(7個) 型別轉換(24個) 序列操作(8個) 物件操作(7個) 反射操作(8個) 變數操