在實務上,若Python報錯時,若引入的套件越多伴隨的異常訊息會變得越來越複雜,看到一推密密麻麻的內容時,很多時候都想直接跳過。
本文將利用Traceback來讓異常訊息變得更好理解。
import traceback
def add_number(a,b):
print(a + b)
try:
add_number('0')
except Exception as e:
error_class = e.__class__.__name__ # 取得錯誤類型
detail = e.args[0] # 取得詳細內容
tb = traceback.sys.exc_info()[2] # 取得Call Stack
lastCallStack = traceback.extract_tb(tb)[-1] # 取得Call Stack的最後一筆資料
fileName = lastCallStack[0] # 取得發生的檔案名稱
lineNum = lastCallStack[1] # 取得發生的行號
funcName = lastCallStack[2] # 取得發生的函數名稱
print(f'error file : {fileName}')
print(f'error line : {lineNum}')
print(f'error function : {funcName}')
print(f'error type: {error_class}')
print(f'detail : {detail}')
看起來並沒有比較難讀,但是因為引入的套件不夠多,當程式碼越來越複雜時,有效的捕獲異常訊息並整理記錄,這是會在後續維護程式上有很大的幫助。
提取回溯資訊中的堆疊跟蹤 (stack trace),它返回一個列表,列表中的每個元素都是一個元組,包含了文件名、行號、函式名和源代碼行。
traceback.extract_tb(tb, limit=None)
tb
是表示回溯 (traceback) 資訊的對象,通常可以使用 traceback.sys.exc_info()[2]
來獲取當前的回溯資訊。limit
是用來限制返回的堆疊跟踪數量的參數,如果不指定,則返回所有的堆疊跟踪資訊。堆疊跟踪資訊的元組格式為 (文件名, 行號, 函式名, 程式碼行)
,你可以根據需要使用這些資訊來進行進一步的處理或日誌記錄。