5.1 Moduł traceback
Traceback (traceback)
— to informacje, które pokazują sekwencję wywołań funkcji, które doprowadziły do wystąpienia wyjątku. Jest to ważne narzędzie do debugowania, ponieważ pomaga programistom zrozumieć, gdzie i dlaczego wystąpił błąd.
Analiza traceback — to ważna część debugowania programów, pozwalająca programistom zrozumieć, gdzie i dlaczego wystąpił błąd. Python udostępnia moduł traceback
, który zawiera funkcje do pracy z tracebacks. Ten moduł pozwala pobierać, formatować i wyświetlać informacje o traceback.
Uzyskiwanie i praca z traceback
Aby pracować z traceback, trzeba zaimportować moduł traceback
, który udostępnia funkcje do formatowania i wyświetlania informacji o traceback.
Przykład uzyskiwania i wyświetlania traceback:
import traceback
def function_c():
return 1 / 0 # Wywoła ZeroDivisionError
def function_b():
function_c()
def function_a():
try:
function_b()
except ZeroDivisionError as e:
print("Wystąpił wyjątek:")
traceback.print_exc() # Drukuje traceback
function_a()
Wyjście:
Wystąpił wyjątek:
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
Funkcja traceback.print_exc()
Ta funkcja drukuje traceback bieżącego wyjątku do standardowego strumienia błędów.
Przykład:
try:
1 / 0
except ZeroDivisionError:
traceback.print_exc()
Funkcja traceback.format_exc()
Ta funkcja zwraca łańcuch z sformatowanym traceback bieżącego wyjątku.
try:
1 / 0
except ZeroDivisionError:
error_message = traceback.format_exc()
print("Uzyskany traceback jako łańcuch:")
print(error_message)
Funkcja traceback.extract_tb(tb)
Ta funkcja wyodrębnia "surowe" dane dotyczące traceback z obiektu traceback (traceback object)
, który można uzyskać przez sys.exc_info()
. Zwraca listę ramek stosu.
5.2 Przetwarzanie i analiza traceback
Funkcja traceback.format_tb(tb)
Ta funkcja zwraca sformatowaną listę łańcuchów, reprezentujących traceback.
import sys
import traceback
def function_c():
return 1 / 0 # Wywoła 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("Sformatowany traceback:")
for line in formatted_tb:
print(line, end="")
function_a()
Funkcja traceback.format_exception(exc_type, exc_value, exc_tb)
Ta funkcja zwraca pełną, sformatowaną listę łańcuchów, reprezentujących wyjątek i traceback.
import sys
import traceback
def function_c():
return 1 / 0 # Wywoła 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("Pełny, sformatowany traceback:")
for line in full_tb:
print(line, end="")
function_a()
Czasami warto bardziej szczegółowo przeanalizować każdą ramkę stosu, aby uzyskać konkretną informację o miejscu, gdzie wystąpił wyjątek, i o kontekście tego miejsca.
import traceback
import sys
def function_c():
return 1 / 0 # Wywoła 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"Plik: {frame.filename}")
print(f"Linja: {frame.lineno}")
print(f"Nazwa funkcji: {frame.name}")
print(f"Tekst: {frame.line}")
print("-" * 40)
function_a()
5.3 Użycie traceback
do logowania
Czasami ważne jest, aby zapisać informacje o traceback w pliku logów do późniejszej analizy. Można to zrobić, używając funkcji modułu traceback
i standardowego modułu logging
.
Przykład:
import logging
import traceback
import sys
logging.basicConfig(filename='error.log', level=logging.ERROR)
def function_c():
return 1 / 0 # Wywoła 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("Wystąpił wyjątek:\n%s", ''.join(full_tb))
function_a()
Logowanie omówimy trochę później, ale myślę, że ta informacja była dla Ciebie przydatna.
GO TO FULL VERSION