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()
我們會在稍後詳細討論日誌記錄,但我想這些資訊對你們會有幫助。
GO TO FULL VERSION