堆疊追蹤

Python SELF TW
等級 17 , 課堂 4
開放

5.1 模組 traceback

堆疊追蹤 (traceback) 是顯示導致異常發生的函數調用順序的資訊。它是個很重要的除錯工具,幫助開發者了解問題發生的位置和原因。

分析堆疊追蹤 (traceback) 是除錯程式中的重要部分,能幫助開發者找出問題發生的位置和原因。Python 提供了模組 traceback,其中包含了用於處理堆疊追蹤的函數。這個模組允許你提取、格式化和輸出堆疊追蹤的資訊。

獲取和處理堆疊追蹤

要處理堆疊追蹤,你需要匯入模組 traceback,它提供了格式化和輸出堆疊追蹤資訊的函數。

獲取和輸出堆疊追蹤的例子:


import traceback

def function_c():
    return 1 / 0  # 這會引發 ZeroDivisionError
            
def function_b():
    function_c()
            
def function_a():
    try:
        function_b()
    except ZeroDivisionError as e:
        print("發生異常:")
        traceback.print_exc()  # 印出堆疊追蹤
            
function_a()

輸出:


發生異常:
Traceback (most recent call last):
    File "example.py", line 12, in function_a
      function_b()
    File "example.py", line 8, in function_b
      function_c()
    File "example.py", line 4, in function_c
      return 1 / 0
ZeroDivisionError: division by zero

函數 traceback.print_exc()

這個函數在標準錯誤流中印出當前異常的堆疊追蹤。

例子:


try:
    1 / 0
except ZeroDivisionError:
    traceback.print_exc()

函數 traceback.format_exc()

這個函數返回一個包含當前異常堆疊追蹤的格式化字串。


try:
    1 / 0
except ZeroDivisionError:
    error_message = traceback.format_exc()
    print("獲取的堆疊追蹤為字串形式:")
    print(error_message)    

函數 traceback.extract_tb(tb)

這個函數從 traceback object 中提取 "原始" 堆疊追蹤資訊,這可以透過 sys.exc_info() 獲得。返回堆疊幀的列表。

5.2 處理和分析堆疊追蹤

函數 traceback.format_tb(tb)

這個函數返回表示堆疊追蹤的格式化字串列表。


import sys
import traceback

def function_c():
    return 1 / 0  # 這會引發 ZeroDivisionError
            
def function_b():
    function_c()
            
def function_a():
    try:
        function_b()
    except ZeroDivisionError:
        tb = sys.exc_info()[2]
        formatted_tb = traceback.format_tb(tb)
        print("格式化的堆疊追蹤:")
        for line in formatted_tb:
            print(line, end="")
            
function_a()

函數 traceback.format_exception(exc_type, exc_value, exc_tb)

這個函數返回表示異常和堆疊追蹤的完整格式化字串列表。


import sys
import traceback

def function_c():
    return 1 / 0  # 這會引發 ZeroDivisionError
            
def function_b():
    function_c()
            
def function_a():
    try:
        function_b()
    except ZeroDivisionError as e:
        exc_type, exc_value, exc_tb = sys.exc_info()
        full_tb = traceback.format_exception(exc_type, exc_value, exc_tb)
        print("完整格式化的堆疊追蹤:")
        for line in full_tb:
            print(line, end="")
            
function_a()

有時可以更詳細地分析每個堆疊幀,以獲取有關異常發生地點和上下文的具體資訊。


import traceback
import sys

def function_c():
    return 1 / 0  # 這會引發 ZeroDivisionError
            
def function_b():
    function_c()
            
def function_a():
    try:
        function_b()
    except ZeroDivisionError:
        tb = sys.exc_info()[2]
        for frame in traceback.extract_tb(tb):
            print(f"文件:{frame.filename}")
            print(f"行號:{frame.lineno}")
            print(f"函數名稱:{frame.name}")
            print(f"內容:{frame.line}")
            print("-" * 40)
            
function_a()

5.3 使用 traceback 進行日誌記錄

有時將堆疊追蹤資訊保存到日誌檔中以供進一步分析是很重要的。這可以使用模組 traceback 和標準 模組 logging 的函數來完成。

例子:


import logging
import traceback
import sys

logging.basicConfig(filename='error.log', level=logging.ERROR)
            
def function_c():
    return 1 / 0  # 這會引發 ZeroDivisionError
            
def function_b():
    function_c()
            
def function_a():
    try:
        function_b()
    except ZeroDivisionError as e:
        exc_type, exc_value, exc_tb = sys.exc_info()
        full_tb = traceback.format_exception(exc_type, exc_value, exc_tb)
        logging.error("發生異常:\n%s", ''.join(full_tb))
            
function_a()

我們會在稍後詳細討論日誌記錄,但我想這些資訊對你們會有幫助。

1
Опрос
錯誤和例外,  17 уровень,  4 лекция
недоступен
錯誤和例外
錯誤和例外
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION