Tracks
/
Roc
Roc
/
Übungen
/
Fehlerbehandlung
Fehlerbehandlung

Fehlerbehandlung

Mittel

Anleitung

Setze verschiedene Arten der Fehlerbehandlung und des Ressourcenmanagements um.

Ein wichtiger Punkt beim Programmieren ist, wie man Fehler behandelt und Ressourcen schließt, auch wenn Fehler auftreten.

Bei dieser Übung geht es darum, verschiedene Fehler zu behandeln. Da die Fehlerbehandlung stark von der Programmiersprache abhängt, musst du in den Tests deines Tracks nachschauen, um zu sehen, was genau verlangt wird.

Implementierung

Du baust einen winzigen Webserver, der eine noch winzigere Benutzerdatenbank abfragt. Klingt einfach, aber in der echten Welt kann einiges schiefgehen (und geht oft schief):

  • die Verbindung könnte unsicher sein: Die URL muss mit "https://" beginnen
  • der Domainname könnte ungültig sein: In dieser Übung sollte er "example.com" sein
  • die Seite ist möglicherweise nicht auffindbar: Nur "https://example.com/", "https://example.com/users/" und "https://example.com/users/<user_id>" sind erlaubt
  • die user_id ist möglicherweise keine positive Ganzzahl
  • möglicherweise existiert kein Benutzer mit dieser user_id in der Datenbank

Wenn etwas schiefgeht, ist es wichtig, dem Endbenutzer eine nette und hilfreiche Fehlermeldung zu geben, damit er das Problem lösen kann. Dazu musst du sicherstellen, dass dein Code informative Fehler von der Stelle, an der der Fehler erkannt wird, bis zu der Stelle weitergibt, an der die Fehlermeldung erzeugt wird.

Zum Glück erlaubt es Roc, dass du eine Nutzlast (also Daten) in deinem Err-Tag mitführst. Es ist verlockend, direkt eine Fehlermeldung mitzuführen (z. B. Err("User #42 was not found")), und in einfachen Fällen mag das in Ordnung sein, aber das hat mehrere Einschränkungen:

  • Möglicherweise hast du in der Funktion, die den Fehler erkennt, nicht genügend Kontext, um eine ausreichend hilfreiche Fehlermeldung zu erzeugen.
    • Zum Beispiel kann die Funktion Str.to_u64 verwendet werden, um alle möglichen Ganzzahlen zu parsen: Tage, Sekunden, Benutzer-IDs und mehr. Wenn die Fehlermeldung nur Could not convert string "0.5" to a positive integer lautet, hat der Benutzer möglicherweise nicht genügend Kontext, um das Problem zu lösen.
  • In vielen Fällen muss dein Fehlerbehandlungscode einige Fehler anders behandeln als andere. Wenn die Fehler jedoch nur Nutzlasten als String tragen, muss dein Fehlerbehandlungscode diesen String parsen, um zu wissen, welches Problem aufgetreten ist: Das ist ineffizient und kann leicht kaputtgehen, wenn die Fehlermeldung jemals geändert wird.
  • Wenn deine Website mehrsprachig ist, musst du die Fehlermeldung in die Sprache des Benutzers übersetzen. Das ist viel einfacher, wenn die Nutzlast des Fehlers maschinenfreundliche Daten sind und kein englischer String.

In dieser Übung tragen deine Fehler stattdessen ein aussagekräftiges Tag zusammen mit seiner eigenen hilfreichen Nutzlast. Wenn der Benutzer beispielsweise nicht gefunden wird, sieht der Fehler so aus: Err(UserNotFound(42)).

Okay, legen wir los! Folgendes musst du tun:

  1. Implementiere get_user, um den angeforderten Benutzer aus der users-„Datenbank“ zurückzugeben (eigentlich nur ein Dict). Stelle sicher, dass die Funktion Err(UserNotFound(user_id)) zurückgibt, falls der Benutzer nicht gefunden wird, statt Err(KeyNotFound).
  2. Implementiere parse_user_id, um den Pfad der URL (z. B. "/users/123") in eine positive ganzzahlige Benutzer-ID (123) umzuwandeln. Gib im Fehlerfall Err(InvalidUserId(user_id_str)) zurück.
  3. Implementiere getPage:
    • Wenn die URL "https://example.com/" ist, gib Ok("Home page") zurück
    • Wenn die URL "https://example.com/users/" ist, gib Ok("Users page") zurück
    • Wenn die URL "https://example.com/users/<user_id>" ist, parse die Benutzer-ID, lade den Benutzer mit dieser ID und gib Ok("<user name>'s page") zurück
    • Wenn das URL-Präfix nicht "https://" ist, gib Err(InsecureConnection(url)) zurück
    • Wenn der Domainname der URL nicht "example.com" ist, gib Err(InvalidDomain(url)) zurück
    • Wenn der Pfad nicht /, /users/ oder /users/<user id> ist, gib Err(PageNotFound(path)) zurück
    • Wenn die Benutzer-ID keine positive Ganzzahl ist, gib Err(InvalidUserId(user_id_str)) zurück
    • Wenn der Benutzer nicht existiert, gib Err(UserNotFound(user_id)) zurück
  4. Implementiere error_essage, um die vorherigen Fehler in übersetzte Fehlermeldungen umzuwandeln. Die Funktion sollte mindestens Englisch unterstützen, aber du bist eingeladen, auch eine andere Sprache auszuprobieren. Die englischen Fehlermeldungen sollten so aussehen:
  • "Insecure connection (non HTTPS): http://example.com/users/789"
  • "Invalid domain name: https://google.com/wrong"
  • "Page not found: /oops"
  • "User ID is not a positive integer: abc"
  • "User #42 was not found"

Hinweis: Statt dem Benutzer eine Fehlermeldung anzuzeigen, wenn er HTTP statt HTTPS verwendet, könnte dein Webserver seinen Browser zu HTTPS weiterleiten, und der Benutzer würde den Fehler nicht einmal bemerken. Da die Fehler in Roc maschinenfreundlich sind, wäre das sehr einfach umzusetzen.

Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
Roc Exercism

Bereit, mit Fehlerbehandlung zu starten?

Melde dich bei Exercism an, um Roc mit 126 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.