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.
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):
"https://" beginnen"example.com" sein"https://example.com/", "https://example.com/users/" und "https://example.com/users/<user_id>" sind erlaubtuser_id ist möglicherweise keine positive Ganzzahluser_id in der DatenbankWenn 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:
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 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:
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).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.getPage:
"https://example.com/" ist, gib Ok("Home page") zurück"https://example.com/users/" ist, gib Ok("Users page") zurück"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"https://" ist, gib Err(InsecureConnection(url)) zurück"example.com" ist, gib Err(InvalidDomain(url)) zurück/, /users/ oder /users/<user id> ist, gib Err(PageNotFound(path)) zurückErr(InvalidUserId(user_id_str)) zurückErr(UserNotFound(user_id)) zurückerror_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.
Melde dich bei Exercism an, um Roc mit 126 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.