Factor-এর এরর সিস্টেমে তিনটি অংশ আছে: এরর সংকেত দিতে throw, একটি হ্যান্ডেল করতে recover, আর নিজের ধরনের এরর ডিফাইন করতে ERROR:।
throwkernel-এ থাকা throw একটি এরর তৈরি করে। আর্গুমেন্টটি যেকোনো মান হতে পারে, একটি স্ট্রিং, একটি সংখ্যা বা একটি টাপল, আর এটিই পরে আপনি যে এররটি পরীক্ষা করতে পারবেন সেটি হয়ে যায়:
! DOCTEST: SKIP
"file not found" throw
throw রিটার্ন করে না; বর্তমান ওয়ার্ডের বাকি অংশটুকু বাদ পড়ে যায়।
recovercontinuations-এ থাকা recover হলো 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টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।