يتكوّن نظام الأخطاء في Factor من ثلاثة أجزاء: throw للإشارة إلى خطأ، وrecover لمعالجة خطأ، وERROR: لتعريف نوعك الخاص من الأخطاء.
throwthrow (في kernel) ترفع خطأ. يمكن أن يكون الوسيط أي قيمة: سلسلة نصية، أو عدد، أو صف، ويصبح هو الخطأ الذي يمكنك فحصه لاحقًا:
! DOCTEST: SKIP
"file not found" throw
throw لا تُرجع؛ ويتم تخطي بقية الكلمة الحالية.
recoverrecover (في continuations) هي آلية المحاولة والالتقاط في Factor. تأخذ كتلة try وكتلة recovery:
recover ( try recovery -- )
إذا انتهت try دون أن ترفع خطأ، يتم تجاهل recovery. وإذا رفعت try خطأ، يُدفع الخطأ إلى المكدس ويتم تشغيل recovery:
[ "boom" throw ] [ drop "caught" ] recover .
! => "caught"
[ "ok" ] [ drop "never runs" ] recover .
! => "ok"
when من kernel هي الرفيق الطبيعي: فهي تشغّل كتلة فقط عندما تكون قمة المكدس صحيحة منطقيًا:
: 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" }
إيلينا، مديرة الجودة الجديدة في مصنع للصحف، تطلب منك كتابة برنامج صغير لمراقبة غرفة الإنتاج.
عرّف صنف خطأ من نوع tuple باسم machine-error باستخدام كلمة التحليل ERROR:. ولا يحتاج إلى أي خانات.
machine-error ! throws a fresh machine-error
عرّف check-humidity. تأخذ قراءة رطوبة من المكدس، وترمي السلسلة النصية "humidity too high" عبر throw عندما تكون القراءة أكبر تمامًا من 70. وإلا فإنها لا تُرجع شيئًا.
50 check-humidity ! returns nothing
80 check-humidity ! throws "humidity too high"
عرّف check-temperature. تأخذ قراءة لدرجة الحرارة، وترمي السلسلة النصية "temperature too high" عبر throw عندما تكون القراءة أكبر تمامًا من 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 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.