Υλοποίησε διάφορα είδη χειρισμού σφαλμάτων και διαχείρισης πόρων.
Ένα σημαντικό σημείο του προγραμματισμού είναι το πώς να χειρίζεσαι τα σφάλματα και να κλείνεις πόρους ακόμα κι αν συμβούν σφάλματα.
Αυτή η άσκηση απαιτεί να χειριστείς διάφορα σφάλματα. Επειδή ο χειρισμός σφαλμάτων εξαρτάται αρκετά από τη γλώσσα προγραμματισμού, θα πρέπει να ανατρέξεις στα τεστ της διαδρομής σου για να δεις τι απαιτείται ακριβώς.
Φτιάχνεις έναν μικροσκοπικό διακομιστή ιστού που αναζητά σε μια ακόμα πιο μικροσκοπική βάση δεδομένων χρηστών. Ακούγεται εύκολο, αλλά στον πραγματικό κόσμο πολλά μπορούν (και συχνά συμβαίνει) να πάνε στραβά:
"https://"
"example.com"
"https://example.com/", "https://example.com/users/" και "https://example.com/users/<user_id>"
user_id μπορεί να μην είναι θετικός ακέραιοςuser_id
Όταν κάτι πάει στραβά, είναι σημαντικό να δώσεις στον τελικό χρήστη ένα ωραίο και κατατοπιστικό μήνυμα σφάλματος, ώστε να μπορέσει να λύσει το πρόβλημα. Γι' αυτό, πρέπει να βεβαιωθείς ότι ο κώδικάς σου διαδίδει κατατοπιστικά σφάλματα από το σημείο όπου εντοπίζεται το σφάλμα ως το σημείο όπου παράγεται το μήνυμα σφάλματος.
Ευτυχώς, η Roc σου επιτρέπει να μεταφέρεις ωφέλιμο φορτίο (δηλαδή δεδομένα) μέσα στην ετικέτα Err σου. Είναι δελεαστικό να μεταφέρεις απευθείας ένα μήνυμα σφάλματος (π.χ. Err("User #42 was not found")), και αυτό μπορεί να είναι εντάξει σε μερικές απλές περιπτώσεις, αλλά έχει αρκετούς περιορισμούς:
Str.to_u64 μπορεί να χρησιμοποιηθεί για να αναλύσει κάθε λογής ακέραιους: ημέρες, δευτερόλεπτα, αναγνωριστικά χρήστη και άλλα. Αν το μήνυμα σφάλματος λέει απλώς Could not convert string "0.5" to a positive integer, ο χρήστης μπορεί να μην έχει αρκετό πλαίσιο για να λύσει το πρόβλημα.Έτσι, σε αυτή την άσκηση, τα σφάλματά σου θα μεταφέρουν αντίθετα μια ετικέτα με νόημα μαζί με το δικό της κατατοπιστικό ωφέλιμο φορτίο. Για παράδειγμα, αν ο χρήστης δεν βρεθεί, το σφάλμα θα μοιάζει με Err(UserNotFound(42)).
Εντάξει, ας ξεκινήσουμε! Να τι πρέπει να κάνεις:
get_user ώστε να επιστρέφει τον ζητούμενο χρήστη από τη users "βάση δεδομένων" (στην πραγματικότητα είναι απλώς ένα Dict). Βεβαιώσου ότι η συνάρτηση επιστρέφει Err(UserNotFound(user_id)) σε περίπτωση που ο χρήστης δεν βρεθεί, αντί για Err(KeyNotFound).parse_user_id ώστε να μετατρέπει τη διαδρομή του URL (όπως "/users/123") σε θετικό ακέραιο αναγνωριστικό χρήστη (123). Σε περίπτωση σφάλματος, επίστρεψε Err(InvalidUserId(user_id_str)).getPage:
"https://example.com/", επίστρεψε Ok("Home page")
"https://example.com/users/", επίστρεψε Ok("Users page")
"https://example.com/users/<user_id>", ανάλυσε το αναγνωριστικό χρήστη, φόρτωσε τον χρήστη με αυτό το αναγνωριστικό και επίστρεψε Ok("<user name>'s page")
"https://", επίστρεψε Err(InsecureConnection(url))
"example.com", επίστρεψε Err(InvalidDomain(url))
/ ή /users/ ή /users/<user id>, επίστρεψε Err(PageNotFound(path))
Err(InvalidUserId(user_id_str))
Err(UserNotFound(user_id))
error_essage ώστε να μετατρέπει τα προηγούμενα σφάλματα σε μεταφρασμένα μηνύματα σφάλματος. Η συνάρτηση θα πρέπει τουλάχιστον να χειρίζεται τα αγγλικά, αλλά σε ενθαρρύνουμε να δοκιμάσεις να χειριστείς και κάποια άλλη γλώσσα. Τα αγγλικά μηνύματα σφάλματος θα πρέπει να μοιάζουν κάπως έτσι:"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"Σημείωση: αντί να εμφανίζεις ένα μήνυμα σφάλματος στον χρήστη όταν χρησιμοποιεί HTTP αντί για HTTPS, ο διακομιστής ιστού σου θα μπορούσε να ανακατευθύνει το πρόγραμμα περιήγησής του στο HTTPS, και ο χρήστης δε θα παρατηρούσε καν το σφάλμα. Εφόσον τα σφάλματα στη Roc είναι φιλικά προς τη μηχανή, αυτό θα ήταν πολύ εύκολο να υλοποιηθεί.
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Roc με 126 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.