Traceback

Python SELF PL
Poziom 17 , Lekcja 4
Dostępny

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.

1
Опрос
Błędy i wyjątki,  17 уровень,  4 лекция
недоступен
Błędy i wyjątki
Błędy i wyjątki
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION