Stacktrace

Python SELF DE
Level 17 , Lektion 4
Verfügbar

5.1 Modul traceback

Stacktrace (traceback) — das ist die Information, die die Reihenfolge der Funktionsaufrufe zeigt, die zu einer Ausnahme geführt haben. Es ist ein wichtiges Tool zum Debuggen, da es Entwicklern hilft zu verstehen, wo und warum ein Fehler aufgetreten ist.

Die Analyse des Stacktraces (traceback) ist ein wichtiger Teil des Debuggens von Programmen, der es Entwicklern ermöglicht zu verstehen, wo und warum ein Fehler aufgetreten ist. Python bietet das Modul traceback, das Funktionen für die Arbeit mit Stacktraces enthält. Dieses Modul ermöglicht das Extrahieren, Formatieren und Ausgeben von Informationen über den Stacktrace.

Erhalt und Verarbeitung des Stacktraces

Um mit dem Stacktrace zu arbeiten, muss das Modul traceback importiert werden, das Funktionen zum Formatieren und Ausgeben von Informationen zum Stacktrace bereitstellt.

Beispiel zum Erhalt und Ausgabe des Stacktraces:


import traceback

def function_c():
    return 1 / 0  # Das wird ZeroDivisionError auslösen
            
def function_b():
    function_c()
            
def function_a():
    try:
        function_b()
    except ZeroDivisionError as e:
        print("Es ist eine Ausnahme aufgetreten:")
        traceback.print_exc()  # Druckt den Stacktrace
            
function_a()

Ausgabe:


Es ist eine Ausnahme aufgetreten:
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

Funktion traceback.print_exc()

Diese Funktion druckt den Stacktrace der aktuellen Ausnahme auf den Standardfehlerstrom.

Beispiel:


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

Funktion traceback.format_exc()

Diese Funktion gibt einen String mit dem formatierten Stacktrace der aktuellen Ausnahme zurück.


try:
    1 / 0
except ZeroDivisionError:
    error_message = traceback.format_exc()
    print("Erhaltener Stacktrace als String:")
    print(error_message)    

Funktion traceback.extract_tb(tb)

Diese Funktion extrahiert "rohe" Informationen über den Stacktrace aus dem Rückverfolgungsobjekt (traceback object), das über sys.exc_info() erhalten werden kann. Gibt eine Liste von Stack-Frames zurück.

5.2 Verarbeitung und Analyse des Stacktrace

Funktion traceback.format_tb(tb)

Diese Funktion gibt eine formatierte Liste von Strings zurück, die den Stacktrace darstellen.


import sys
import traceback

def function_c():
    return 1 / 0  # Das wird ZeroDivisionError auslösen
            
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("Formatierter Stacktrace:")
        for line in formatted_tb:
            print(line, end="")
            
function_a()

Funktion traceback.format_exception(exc_type, exc_value, exc_tb)

Diese Funktion gibt eine vollständige formatierte Liste von Strings zurück, die die Ausnahme und den Stacktrace darstellen.


import sys
import traceback

def function_c():
    return 1 / 0  # Das wird ZeroDivisionError auslösen
            
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("Vollständiger formatierter Stacktrace:")
        for line in full_tb:
            print(line, end="")
            
function_a()

Manchmal ist es nützlich, jeden Stackframe detaillierter zu analysieren, um spezifische Informationen über den Ort zu erhalten, an dem die Ausnahme aufgetreten ist, und über den Kontext dieses Ortes.


import traceback
import sys

def function_c():
    return 1 / 0  # Das wird ZeroDivisionError auslösen
            
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"Datei: {frame.filename}")
            print(f"Zeile: {frame.lineno}")
            print(f"Funktionsname: {frame.name}")
            print(f"Text: {frame.line}")
            print("-" * 40)
            
function_a()

5.3 Verwendung von traceback zur Protokollierung

Manchmal ist es wichtig, Informationen über den Stacktrace in einer Logdatei für eine spätere Analyse zu speichern. Dies kann mit den Funktionen des Moduls traceback und dem Standardmodul logging gemacht werden.

Beispiel:


import logging
import traceback
import sys

logging.basicConfig(filename='error.log', level=logging.ERROR)
            
def function_c():
    return 1 / 0  # Das wird ZeroDivisionError auslösen
            
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("Es ist eine Ausnahme aufgetreten:\n%s", ''.join(full_tb))
            
function_a()

Logging werden wir etwas später betrachten, aber ich denke, diese Information war für dich nützlich.

1
Опрос
Fehler und Ausnahmen,  17 уровень,  4 лекция
недоступен
Fehler und Ausnahmen
Fehler und Ausnahmen
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION