CodeGym /Kurse /Python SELF DE /Fehler während des Programmablaufs

Fehler während des Programmablaufs

Python SELF DE
Level 17 , Lektion 0
Verfügbar

1.1 Auftreten von Fehlern

Fehler (und Ausnahmen) sind ein unvermeidlicher Teil der Programmierung. Sie treten auf, wenn ein Programm auf unvorhergesehene Situationen trifft, die es nicht behandeln kann. In Python gibt es ein Ausnahmebehandlungssystem, das es ermöglicht, Fehler abzufangen und zu bearbeiten, um das Programm vor dem Absturz zu bewahren.

Ausnahmen treten am häufigsten in folgenden Situationen auf:

Syntaktische Fehler:

Diese Fehler werden während der Kompilierung des Codes entdeckt und hängen mit falscher Grammatik der Python-Sprache zusammen. Zum Beispiel fehlende Doppelpunkte oder falsche Schlüsselwörter.


if True:
    print("Hello")
        

Laufzeitfehler (Runtime Errors):

Diese Fehler treten während der Ausführung des Programms auf und können aus verschiedenen Gründen verursacht werden, wie z.B. Division durch Null, Zugriff auf ein nicht existierendes Listenelement, falsche Verwendung von Datentypen usw.


print(1 / 0)  # ZeroDivisionError
        

Logische Fehler:

Diese Fehler treten auf, wenn ein Programm ohne Absturz läuft, aber ein falsches Ergebnis aufgrund eines Logikfehlers im Programm liefert. Logische Fehler werfen keine Ausnahmen und sind schwerer zu debuggen.

Logische Fehler werden oft als Bugs bezeichnet — es ist so etwas wie eine unvollständige Funktionalität des Programms. Laufzeitfehler hingegen werden als Ausnahmen bezeichnet. Für jeden solchen Fehler erstellt Python ein spezielles Objekt (Ausnahme) und wirft es ins Programm...

1.2 Der Pfad der Ausnahmen

Wenn in Python eine Ausnahme auftritt, steigt sie den Call-Stack hinauf, bis sie behandelt wird. Der Call-Stack ist die Reihenfolge der Funktionsaufrufe, die zur Ausnahme geführt haben.

Mechanismus des Ausnahmeaufstiegs

  • Auftreten der Ausnahme: Wenn ein Fehler auftritt, erstellt Python ein Ausnahmeobjekt.
  • Suche nach einem Ausnahmehandler: Der Python Interpreter beginnt, nach einem Ausnahmehandler im aktuellen Codeblock zu suchen. Wenn kein Handler gefunden wird, wechselt er zum nächsten Codeblock, der die aktuelle Funktion aufgerufen hat.
  • Aufsteigen der Ausnahme im Stack: Dieser Prozess wiederholt sich, bis ein Handler gefunden wird oder der Call-Stack erschöpft ist.
  • Beendigung des Programms: Wenn kein Handler gefunden wird, beendet das Programm seine Ausführung und gibt eine Fehlermeldung aus.

Beispiel:


def func_a():
    func_b()
        
def func_b():
    func_c()
        
def func_c():
    print(1 / 0)  # Hier tritt die Ausnahme ZeroDivisionError auf
        
func_a()
        

In diesem Beispiel tritt die Ausnahme ZeroDivisionError in der Funktion func_c auf, dann steigt sie den Call-Stack über func_b und func_a hinauf. Wenn nirgendwo ein Handler gefunden wird, endet das Programm mit einer Fehlermeldung.

1.3 Lesen der Logs

Wenn das Programm aufgrund einer nicht behandelten Ausnahme beendet wird, gibt Python eine Stapelrückverfolgung (traceback) aus, die Entwicklern hilft zu verstehen, was schiefgelaufen ist. Die Stapelrückverfolgung enthält Informationen über die Reihenfolge der Funktionsaufrufe, die zur Ausnahme führten, und kann zur Fehlersuche im Programm analysiert werden.

Beispiel einer Stapelrückverfolgung


Traceback (most recent call last):
    File "example.py", line 10, in 
      
  
      
  
      
  
    func_a() File "example.py", line 2, in func_a func_b() File "example.py", line 5, in func_b func_c() File "example.py", line 8, in func_c print(1 / 0) ZeroDivisionError: division by zero 
  

Analyse der Stapelrückverfolgung

  • Typ der Ausnahme und Nachricht: Am Ende der Rückverfolgung wird der Ausnahmetyp und die Nachricht angegeben. In dem gegebenen Beispiel ist es ZeroDivisionError: division by zero.
  • Reihenfolge der Aufrufe: Die Stapelrückverfolgung zeigt die Reihenfolge der Funktionsaufrufe. In unserem Beispiel trat der Fehler in der Zeile print(1 / 0) in der Funktion func_c auf, die von func_b aufgerufen wurde, das wiederum von func_a aufgerufen wurde.
  • Dateien und Codezeilen: In jeder Zeile der Rückverfolgung wird die Datei und die Zeilennummer angegeben, wo der Aufruf stattfand. Dies hilft, den Fehler im Code schnell zu finden und zu beheben.

Praktische Nutzung der Stapelrückverfolgung

Die Stapelrückverfolgung ist ein wichtiges Werkzeug zur Fehlersuche und Analyse von Programmen. Sie hilft Entwicklern, den Grund des Fehlers zu verstehen und die Stelle im Code zu finden, an der er auftrat. Hier sind einige Tipps zur Nutzung der Stapelrückverfolgung:

  1. Von unten nach oben lesen: Beginne die Analyse mit dem untersten Aufruf in der Rückverfolgung, weil dies der Ort ist, an dem die Ausnahme auftrat.
  2. Überprüfen aller Aufrufe: Untersuche alle Aufrufe in der Rückverfolgung, um den Pfad zu verstehen, den die Ausnahme durchlaufen hat.
  3. Korrektur des Codes: Nutze die Informationen aus der Rückverfolgung zur Korrektur des Codes und Vermeidung ähnlicher Fehler in der Zukunft.

Mehr über Ausnahmen erfährst du in den folgenden Vorlesungen.

Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION