Το σύστημα σφαλμάτων της Factor έχει τρία μέρη: throw για να πετάξεις ένα σφάλμα, recover για να χειριστείς ένα, και ERROR: για να ορίσεις το δικό σου είδος σφάλματος.
throwΤο throw (στο kernel) πετάει ένα σφάλμα. Το όρισμα μπορεί να είναι οποιαδήποτε τιμή, είτε συμβολοσειρά, είτε αριθμός, είτε tuple, και γίνεται το σφάλμα που μπορείς να εξετάσεις αργότερα:
! DOCTEST: SKIP
"file not found" throw
Το throw δεν επιστρέφει· η υπόλοιπη τρέχουσα λέξη παραλείπεται.
recoverΤο recover (στο continuations) είναι το try/catch της Factor. Παίρνει ένα try quotation και ένα recovery quotation:
recover ( try recovery -- )
Αν το try ολοκληρωθεί χωρίς να πετάξει σφάλμα, το recovery αγνοείται. Αν το try πετάξει σφάλμα, το σφάλμα ωθείται στη στοίβα και το recovery εκτελείται:
[ "boom" throw ] [ drop "caught" ] recover .
! => "caught"
[ "ok" ] [ drop "never runs" ] recover .
! => "ok"
Το when από το kernel είναι ο φυσικός σύντροφός του: εκτελεί ένα quotation μόνο όταν η κορυφή της στοίβας είναι αληθής:
: check-positive ( n -- )
0 < [ "negative!" throw ] when ;
ERROR:Το ERROR: ορίζει μια κλάση tuple και μια λέξη που κατασκευάζει ένα καινούριο στιγμιότυπο και το πετάει:
! DOCTEST: SKIP
ERROR: not-found path ;
"/missing" not-found
! throws T{ not-found { path "/missing" } }
Ένα σφάλμα χωρίς slots είναι απλώς ERROR: name ;, και η κλήση του name πετάει ένα κενό στιγμιότυπο. Τα tuples που ορίζονται με το ERROR: φέρουν ένα predicate κλάσης, το name?, που μπορείς να το χρησιμοποιήσεις για να ελέγξεις αν ένα σφάλμα που έπιασες ήταν αυτού του τύπου.
Ένα σφάλμα που έπιασες είναι απλώς ένα tuple, οπότε κάθε slot του ERROR: συνοδεύεται από τον ίδιο αυτόματα παραγόμενο reader slot>> όπως κάθε άλλο tuple.
! DOCTEST: SKIP
{
T{ not-found { path "/a" } }
T{ not-found { path "/b" } }
}
[ path>> ] map . ! => { "/a" "/b" }
Η Έλενα, η νέα υπεύθυνη ποιότητας σε ένα εργοστάσιο εφημερίδων, σου ζητά να γράψεις ένα μικρό πρόγραμμα που θα παρακολουθεί τον χώρο παραγωγής.
Όρισε μια κλάση tuple σφάλματος machine-error χρησιμοποιώντας τη λέξη ανάλυσης ERROR:. Δεν χρειάζεται πεδία.
machine-error ! throws a fresh machine-error
Όρισε τη check-humidity. Παίρνει μια μέτρηση υγρασίας από τη στοίβα και κάνει throw τη συμβολοσειρά "humidity too high" όταν η μέτρηση είναι αυστηρά μεγαλύτερη από 70. Διαφορετικά, δεν επιστρέφει τίποτα.
50 check-humidity ! returns nothing
80 check-humidity ! throws "humidity too high"
Όρισε τη check-temperature. Παίρνει μια μέτρηση θερμοκρασίας και κάνει throw τη συμβολοσειρά "temperature too high" όταν η μέτρηση είναι αυστηρά μεγαλύτερη από 500. Διαφορετικά, δεν επιστρέφει τίποτα.
400 check-temperature ! returns nothing
600 check-temperature ! throws "temperature too high"
Όρισε τη monitor ώστε να παίρνει μια υγρασία και μια θερμοκρασία από τη στοίβα και να εκτελεί και τους δύο ελέγχους. Αν κάποιος από τους ελέγχους πετάξει, το monitor πρέπει να πετάξει ένα νέο machine-error αντ' αυτού. Αν και οι δύο περάσουν, το monitor δεν επιστρέφει τίποτα.
50 400 monitor ! returns nothing
80 400 monitor ! throws a machine-error
50 600 monitor ! throws a machine-error
Όρισε τη monitor-batch ώστε να παίρνει έναν πίνακα από μετρήσεις { humidity temperature } και να επιστρέφει πόσες από αυτές θα αποτύχουν (δηλαδή, πόσες θα έκαναν το monitor να πετάξει).
{ { 50 400 } { 80 400 } { 50 600 } { 60 200 } } monitor-batch .
! => 2
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Factor με 47 έννοιες163 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.