17 Debugging
Python bietet mehrere Möglichkeiten zum Debuggen: durch klassische Print-Ausgaben, durch das integrierte Debugging-Modul pdb oder mithilfe von Entwicklungsumgebungen wie Visual Studio Code (VS Code).
Dies ist die einfachste, aber oft sehr effektive Methode. Dabei werden Variablenwerte oder Kontrollflussinformationen mit print() ausgegeben.
def divide_numbers(a, b):
print('a:', a) # Wert von a ausgeben
print('b:', b) # Wert von b ausgeben
if b == 0:
print('Fehler: Division durch Null')
return None
return a / b
result = divide_numbers(10, 0)
print('Ergebnis:', result)
pdb-ModulDas Modul pdb (Python Debugger) erlaubt schrittweises Durchlaufen des Codes mit interaktiver Steuerung.
import pdb
def greet_user(name):
pdb.set_trace() # Hier startet der Debugger
greeting = 'Hello ' + name
print(greeting)
greet_user('Anna')
n: next – führt die nächste Zeile auss: step – springt in Funktionsaufrufe hineinc: continue – setzt das Programm bis zum nächsten Haltepunkt fortq: quit – verlässt den Debuggerp variable: gibt den Wert einer Variablen ausManche Fehler lassen sich nicht vermeiden, können aber abgefangen und behandelt werden.
def convert_to_int(value):
try:
return int(value)
except ValueError as e:
print('Ungültige Eingabe:', e)
return None
number = convert_to_int('abc')
print('Ergebnis:', number)
Wenn z. B. Log-Dateien erstellt werden sollen, in der nur Fehler oder kritische Ereignisse gespeichert werden sollen.
| Level | Beschreibung |
|---|---|
DEBUG |
Detaillierte Debug-Informationen |
INFO |
Nur zur Info: Dinge, die wie vorgesehen passiert sein |
WARNING |
Wenn etwas Unerwartetes passiert ist, es hat jedoch nicht zu einem Absturz geführt hat |
ERROR |
Schwerwiegender Fehler, der nicht zu einem Programmabsturz geführt hat (z. B. das Programm konnte eine bestimmte Funktion nicht ausführen) |
CRITICAL |
Schwerwiegender, der zu einem Programmabsturz pgeführt hat |
Beispiel:
import logging
# Setup the logger
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
# Formatter (optional)
formatter = logging.Formatter(
'%(asctime)s:%(levelname)s:%(funcName)s:%(message)s',
)
# File handler
filepath = Path(__file__).parent.joinpath('log_standard.log')
file_handler = logging.FileHandler(filepath)
file_handler.setLevel(logging.INFO) # Info and higher will be logged
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
def divide_integers(a: int, b: int) -> float | None:
try:
logger.info(f'a={a}, b={b}')
result = a / b
return result
except ZeroDivisionError as e:
logger.exception(f'Exception was raised: {e}')
return None
def main() -> None:
for _ in range(3):
print(divide_integers(10, 0))
if __name__ == '__main__':
main()
Inhalt der erstellten Datei log_standard.log:
2025-03-22 12:05:07,716:INFO:divide_integers:a=10, b=0
2025-03-22 12:05:07,716:ERROR:divide_integers:Exception was raised: division by zero
Traceback (most recent call last):
File ".../logging_standard_lib--edit.py", line 28, in divide_integers
result = a / b
ZeroDivisionError: division by zero
[...]
Ohne Boilerplate:
from loguru import logger
logger.debug("That's it, beautiful and simple logging!")
VS Code bietet eine sehr leistungsstarke Debugging-Umgebung mit grafischer Oberfläche.
Erstelle eine Datei .vscode/launch.json, um z. B. Argumente zu übergeben:
{
"version": "0.2.0",
"configurations": [
{
"name": "Python: Datei starten",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal"
}
]
}