Zum Hauptinhalt springen

Fehler bei Web-Anfragen behandeln

Was schiefgehen kann

  • kein Internet
  • Timeout
  • 404 (nicht gefunden)
  • Server 500

Robustes Muster

import json
from urllib.request import urlopen, Request
from urllib.error import URLError, HTTPError

def lade_json(url: str):
try:
req = Request(url, headers={"User-Agent": "CodeClub/1.0"})
with urlopen(req, timeout=10) as response:
return json.loads(response.read().decode("utf-8"))
except HTTPError as e:
print("HTTP-Fehler:", e.code)
except URLError as e:
print("Netzwerk-Fehler:", e.reason)
except TimeoutError:
print("Zeitueberschreitung")
except json.JSONDecodeError:
print("Antwort war kein gueltiges JSON")
return None

daten = lade_json("https://jsonplaceholder.typicode.com/todos/1")
if daten:
print(daten["title"])

Rate mal!

Warum timeout?

Auflösung

Damit das Programm nicht ewig hängt, wenn der Server nicht antwortet.

Probiere es selbst

Experiment 1

Gute URL laden.

Experiment 2

Kaputte URL testen.

Experiment 3

Timeout klein setzen und beobachten.

Übungen

Level 1

Erkläre URLError vs HTTPError grob.

Level 2

Funktion die None bei Fehler zurückgibt.

Level 3

Freundliche Meldung an User.

Level-2-Lösung

Siehe Beispiel lade_json oben.

Mini-Quiz

Mini-QuizWas hilft gegen ewig wartende Anfragen?

Robust! Als Nächstes: Daten auswählen und anzeigen.