Kurzusok
/
Roc
Roc
/
Feladatok
/
Hibakezelés
Hibakezelés

Hibakezelés

Közepes

Utasítások

Valósítsd meg a hibakezelés és az erőforrás-kezelés különféle formáit.

A programozás egyik fontos pontja, hogy miként kezeljük a hibákat, és hogyan zárjuk le az erőforrásokat akkor is, ha hibák lépnek fel.

Ez a feladat megkívánja, hogy különféle hibákat kezelj. Mivel a hibakezelés meglehetősen programozási nyelvfüggő, a kurzod tesztjeiben kell utánanézned, hogy pontosan mire van szükség.

Megvalósítás

Egy apró webkiszolgálót építesz, amely egy még apróbb felhasználói adatbázisból kérdez le. Egyszerűnek hangzik, de a való világban sok minden elromolhat (és gyakran el is romlik):

  • a kapcsolat nem biztonságos lehet: az URL csak "https://"-tal kezdődhet
  • a domainnév érvénytelen lehet: ebben a feladatban "example.com"-nak kell lennie
  • az oldal nem található: csak a "https://example.com/", "https://example.com/users/" és "https://example.com/users/<user_id>" URL-ek engedélyezettek
  • a user_id lehet, hogy nem pozitív egész szám
  • lehet, hogy egyetlen felhasználó sem létezik az adatbázisban ezzel a user_id-val

Amikor valami elromlik, fontos, hogy a végfelhasználó szép és hasznos hibaüzenetet kapjon, hogy meg tudja oldani a problémát. Ehhez biztosítanod kell, hogy a kódod informatív hibákat továbbítson attól a ponttól, ahol a hibát észlelik, addig a pontig, ahol a hibaüzenet előáll.

Szerencsére a Roc lehetővé teszi, hogy payloadot (azaz adatot) hordozz az Err címke belsejében. Csábító közvetlenül hibaüzenetet hordozni (pl. Err("User #42 was not found")), és ez néhány egyszerű esetben rendben is lehet, de számos korlátja van:

  • előfordulhat, hogy nincs elég kontextusod a hibát észlelő függvényben ahhoz, hogy kellően hasznos hibaüzenetet állíts elő.
    • Például a Str.to_u64 függvény mindenféle egész szám feldolgozására használható: napok, másodpercek, felhasználói azonosítók és egyebek. Ha a hibaüzenet csupán ennyit mond: Could not convert string "0.5" to a positive integer, a felhasználónak lehet, hogy nem lesz elég kontextusa a probléma megoldásához.
  • sok esetben a hibakezelő kódodnak egyes hibákat másképp kell kezelnie, mint másokat. Ha azonban a hibák csak string payloadot hordoznak, a hibakezelő kódodnak elemeznie kell ezt a stringet, hogy tudja, milyen probléma történt: ez nem hatékony, és könnyen elromolhat, ha a hibaüzenetet valaha módosítják.
  • ha a webhelyed többnyelvű, a hibaüzenetet le kell fordítanod a felhasználó nyelvére. Ezt sokkal könnyebb megtenni, ha a hiba payloadja gépbarát adat, nem pedig angol string.

Ebben a feladatban tehát a hibáid egy beszédes címkét hordoznak majd a saját hasznos payloadjukkal együtt. Például ha a felhasználó nem található, a hiba így fog kinézni: Err(UserNotFound(42)).

Jó, kezdjük! A következőket kell tenned:

  1. Valósítsd meg a get_user függvényt, amely visszaadja a kért felhasználót a users „adatbázisból” (valójában csak egy Dict). Ügyelj arra, hogy a függvény Err(UserNotFound(user_id)) értéket adjon vissza, ha a felhasználó nem található, ne pedig Err(KeyNotFound)-ot.
  2. Valósítsd meg a parse_user_id függvényt, amely az URL útvonalát (például "/users/123") pozitív egész felhasználói azonosítóvá (123) alakítja. Hiba esetén Err(InvalidUserId(user_id_str))-t adj vissza.
  3. Valósítsd meg a getPage függvényt:
    • Ha az URL "https://example.com/", add vissza ezt: Ok("Home page").
    • Ha az URL "https://example.com/users/", add vissza ezt: Ok("Users page").
    • Ha az URL "https://example.com/users/<user_id>", elemezd a felhasználói azonosítót, töltsd be az adott azonosítójú felhasználót, és add vissza ezt: Ok("<user name>'s page").
    • Ha az URL előtagja nem "https://", add vissza ezt: Err(InsecureConnection(url)).
    • Ha az URL domainneve nem "example.com", add vissza ezt: Err(InvalidDomain(url)).
    • Ha az útvonal nem /, /users/ vagy /users/<user id>, add vissza ezt: Err(PageNotFound(path)).
    • Ha a felhasználói azonosító nem pozitív egész szám, add vissza ezt: Err(InvalidUserId(user_id_str)).
    • Ha a felhasználó nem létezik, add vissza ezt: Err(UserNotFound(user_id)).
  4. Valósítsd meg az error_essage függvényt, amely az előző hibákat lefordított hibaüzenetekké alakítja. A függvénynek legalább az angolt kezelnie kell, de bátran próbálkozz más nyelvvel is. Az angol hibaüzenetek így nézzenek ki:
  • "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"

Megjegyzés: ahelyett, hogy hibaüzenetet jelenítenél meg a felhasználónak, amikor HTTP-t használ HTTPS helyett, a webszervered átirányíthatná a böngészőjét HTTPS-re, és a felhasználó észre sem venné a hibát. Mivel a hibák a Rocban gépbarátok, ezt nagyon könnyű lenne megvalósítani.

Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Roc Exercism

Készen állsz elkezdeni a(z) Hibakezelés feladatot?

Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Roc nyelvet 126 feladat segítségével, valódi emberi mentorálással, mindez ingyen.