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.
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):
"https://"-tal kezdődhet"example.com"-nak kell lennie"https://example.com/", "https://example.com/users/" és "https://example.com/users/<user_id>" URL-ek engedélyezettekuser_id lehet, hogy nem pozitív egész számuser_id-valAmikor 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:
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.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:
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.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.getPage függvényt:
"https://example.com/", add vissza ezt: Ok("Home page")."https://example.com/users/", add vissza ezt: Ok("Users page")."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")."https://", add vissza ezt: Err(InsecureConnection(url))."example.com", add vissza ezt: Err(InvalidDomain(url))./, /users/ vagy /users/<user id>, add vissza ezt: Err(PageNotFound(path)).Err(InvalidUserId(user_id_str)).Err(UserNotFound(user_id)).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.
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.