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
Robust! Als Nächstes: Daten auswählen und anzeigen.