A Factor hibarendszere három részből áll: a throw a hiba jelzésére, a recover egy hiba kezelésére, az ERROR: pedig saját hibatípus definiálására.
throwA throw (a kernel szótárban) hibát vált ki. Az argumentum bármilyen érték lehet (string, szám vagy tuple), és ez lesz a hiba, amit később megvizsgálhatsz:
! DOCTEST: SKIP
"file not found" throw
A throw nem tér vissza; az aktuális szó többi része kimarad.
recoverA recover (a continuations szótárban) a Factor try/catch mechanizmusa. Egy try és egy recovery quotationt vár:
recover ( try recovery -- )
Ha a try dobás nélkül befejeződik, a recovery figyelmen kívül marad. Ha a try dob, a hiba a verembe kerül, és a recovery lefut:
[ "boom" throw ] [ drop "caught" ] recover .
! => "caught"
[ "ok" ] [ drop "never runs" ] recover .
! => "ok"
A when (a kernel szótárból) a természetes társa: csak akkor futtat egy quotationt, ha a verem tetején lévő érték igaz értékű:
: check-positive ( n -- )
0 < [ "negative!" throw ] when ;
ERROR:Az ERROR: egy tuple osztályt és egy szót definiál, amely létrehoz egy friss példányt, és dobja azt:
! DOCTEST: SKIP
ERROR: not-found path ;
"/missing" not-found
! throws T{ not-found { path "/missing" } }
A slot nélküli hiba egyszerűen ERROR: name ;; a name meghívása egy üres példányt dob. Az ERROR: kulcsszóval definiált tuple-ok rendelkeznek egy name? osztálypredikátummal, amellyel tesztelheted, hogy egy elkapott hiba ilyen típusú volt-e.
Az elkapott hiba csupán egy tuple, így minden ERROR: slot ugyanazzal az automatikusan generált slot>> olvasóval rendelkezik, mint bármely más tuple.
! DOCTEST: SKIP
{
T{ not-found { path "/a" } }
T{ not-found { path "/b" } }
}
[ path>> ] map . ! => { "/a" "/b" }
Elena, az újsággyár új minőségbiztosítási vezetője arra kér, hogy írj egy kis szoftvert a termelőterem felügyeletére.
Definiálj egy machine-error hibatuple-osztályt az ERROR: feldolgozó szóval. Nem igényel slotokat.
machine-error ! throws a fresh machine-error
Definiáld a check-humidity szót. Levesz a veremről egy páratartalom-értéket, és throw-val dobja a "humidity too high" stringet, ha az érték szigorúan nagyobb, mint 70. Egyébként nem ad vissza semmit.
50 check-humidity ! returns nothing
80 check-humidity ! throws "humidity too high"
Definiáld a check-temperature szót. Levesz egy hőmérséklet-értéket, és throw-val dobja a "temperature too high" stringet, ha az érték szigorúan nagyobb, mint 500. Egyébként nem ad vissza semmit.
400 check-temperature ! returns nothing
600 check-temperature ! throws "temperature too high"
Definiáld a monitor szót úgy, hogy levegyen a veremről egy páratartalmat és egy hőmérsékletet, és lefuttassa mindkét ellenőrzést. Ha valamelyik ellenőrzés dob, a monitor helyette egy friss machine-error-t dobjon. Ha mindkettő sikeres, a monitor nem ad vissza semmit.
50 400 monitor ! returns nothing
80 400 monitor ! throws a machine-error
50 600 monitor ! throws a machine-error
Definiáld a monitor-batch szót úgy, hogy levegyen a veremről egy { humidity temperature } mérésekből álló tömböt, és adja vissza, hány hibázna közülük (azaz hány okozná, hogy a monitor dob).
{ { 50 400 } { 80 400 } { 50 600 } { 60 200 } } monitor-batch .
! => 2
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Factor nyelvet 47 fogalom163 feladat segítségével, valódi emberi mentorálással, mindez ingyen.