Factor के एरर सिस्टम में तीन हिस्से हैं: एरर पैदा करने के लिए throw, उसे संभालने के लिए recover, और अपनी खुद की तरह की एरर बनाने के लिए ERROR:।
throwthrow (kernel में मौजूद) एरर पैदा करता है। इसका आर्गुमेंट कोई भी वैल्यू हो सकता है, चाहे स्ट्रिंग हो, संख्या हो या टपल, और यही वैल्यू वह एरर बन जाती है जिसे आप बाद में जाँच सकते हैं:
! DOCTEST: SKIP
"file not found" throw
throw लौटता नहीं है; मौजूदा वर्ड का बाकी हिस्सा छोड़ दिया जाता है।
recoverrecover (continuations में मौजूद) Factor का try/catch है। यह एक try कोटेशन और एक recovery कोटेशन लेता है:
recover ( try recovery -- )
अगर try बिना कोई एरर पैदा किए पूरा हो जाता है, तो recovery को अनदेखा कर दिया जाता है। अगर try एरर पैदा करता है, तो वह एरर स्टैक पर रख दी जाती है और recovery चलाया जाता है:
[ "boom" throw ] [ drop "caught" ] recover .
! => "caught"
[ "ok" ] [ drop "never runs" ] recover .
! => "ok"
kernel से आने वाला when इसका स्वाभाविक साथी है: यह कोटेशन तभी चलाता है जब स्टैक के सबसे ऊपर की वैल्यू सही हो:
: check-positive ( n -- )
0 < [ "negative!" throw ] when ;
ERROR:ERROR: एक टपल क्लास और एक वर्ड बनाता है, जो एक नया इंस्टेंस बनाकर उसे एरर के रूप में पैदा कर देता है:
! DOCTEST: SKIP
ERROR: not-found path ;
"/missing" not-found
! throws T{ not-found { path "/missing" } }
बिना स्लॉट वाली एरर के लिए बस ERROR: name ; लिखना ही काफी है। name को कॉल करने पर एक खाली इंस्टेंस पैदा होता है। ERROR: से बनाए गए टपल के साथ एक क्लास प्रेडिकेट name? आता है, जिसकी मदद से आप जाँच सकते हैं कि पकड़ी गई एरर उसी टाइप की थी या नहीं।
पकड़ी गई एरर असल में एक टपल ही होती है, इसलिए ERROR: के हर स्लॉट के साथ वही अपने आप बनने वाला slot>> रीडर मिलता है जो किसी भी दूसरे टपल के साथ मिलता है।
! DOCTEST: SKIP
{
T{ not-found { path "/a" } }
T{ not-found { path "/b" } }
}
[ path>> ] map . ! => { "/a" "/b" }
अखबार की एक फैक्ट्री में नई क्वालिटी मैनेजर एलेना आपसे कहती हैं कि आप प्रोडक्शन रूम पर नज़र रखने के लिए एक छोटा सा सॉफ्टवेयर लिखें।
ERROR: पार्सिंग शब्द का इस्तेमाल करके machine-error नाम की एक एरर टपल क्लास बनाइए। इसमें किसी स्लॉट की ज़रूरत नहीं है।
machine-error ! throws a fresh machine-error
check-humidity बनाइए। यह स्टैक से नमी की रीडिंग लेता है और जब वह रीडिंग 70 से सख्ती से ज़्यादा हो, तो स्ट्रिंग "humidity too high" throw करता है। ऐसा न हो तो यह कुछ नहीं लौटाता।
50 check-humidity ! returns nothing
80 check-humidity ! throws "humidity too high"
check-temperature बनाइए। यह तापमान की रीडिंग लेता है और जब वह रीडिंग 500 से सख्ती से ज़्यादा हो, तो स्ट्रिंग "temperature too high" throw करता है। ऐसा न हो तो यह कुछ नहीं लौटाता।
400 check-temperature ! returns nothing
600 check-temperature ! throws "temperature too high"
monitor बनाइए, जो स्टैक से नमी और तापमान लेकर दोनों जाँच चलाता है। अगर कोई भी जाँच throw करती है, तो monitor को उसके बजाय एक नया machine-error throw करना चाहिए। अगर दोनों जाँच पास हो जाएँ, तो 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 throw करेगा)।
{ { 50 400 } { 80 400 } { 50 600 } { 60 200 } } monitor-batch .
! => 2
Exercism पर साइन अप कीजिए और Factor को 47 कॉन्सेप्ट163 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।