المسارات
/
Factor
Factor
/
التمارين
/
أمان المصنع
أمان المصنع

أمان المصنع

تمرين تعلّمي

مقدمة

يتكوّن نظام الأخطاء في Factor من ثلاثة أجزاء: throw للإشارة إلى خطأ، وrecover لمعالجة خطأ، وERROR: لتعريف نوعك الخاص من الأخطاء.

throw

throw (في kernel) ترفع خطأ. يمكن أن يكون الوسيط أي قيمة: سلسلة نصية، أو عدد، أو صف، ويصبح هو الخطأ الذي يمكنك فحصه لاحقًا:

! DOCTEST: SKIP
"file not found" throw

throw لا تُرجع؛ ويتم تخطي بقية الكلمة الحالية.

recover

recover (في 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" }

التعليمات

إيلينا، مديرة الجودة الجديدة في مصنع للصحف، تطلب منك كتابة برنامج صغير لمراقبة غرفة الإنتاج.

1. عرّف خطأً مخصصًا

عرّف صنف خطأ من نوع tuple باسم machine-error باستخدام كلمة التحليل ERROR:. ولا يحتاج إلى أي خانات.

machine-error   ! throws a fresh machine-error

2. افحص الرطوبة

عرّف check-humidity. تأخذ قراءة رطوبة من المكدس، وترمي السلسلة النصية "humidity too high" عبر throw عندما تكون القراءة أكبر تمامًا من 70. وإلا فإنها لا تُرجع شيئًا.

50 check-humidity   ! returns nothing
80 check-humidity   ! throws "humidity too high"

3. افحص درجة الحرارة

عرّف check-temperature. تأخذ قراءة لدرجة الحرارة، وترمي السلسلة النصية "temperature too high" عبر throw عندما تكون القراءة أكبر تمامًا من 500. وإلا فإنها لا تُرجع شيئًا.

400 check-temperature   ! returns nothing
600 check-temperature   ! throws "temperature too high"

4. راقب الآلة

عرّف monitor لتأخذ الرطوبة ودرجة الحرارة من المكدس وتُشغّل الفحصين معًا. إذا رمى أحد الفحصين، فعلى monitor أن ترمي كائن machine-error جديدًا بدلًا من ذلك. وإذا نجح الفحصان، فإن monitor لا تُرجع شيئًا.

50 400 monitor   ! returns nothing
80 400 monitor   ! throws a machine-error
50 600 monitor   ! throws a machine-error

5. راقب دفعة من القراءات

عرّف monitor-batch لتأخذ مصفوفة من القراءات على شكل { humidity temperature } وتُرجع عدد القراءات التي ستفشل (أي عدد القراءات التي ستجعل monitor ترمي).

{ { 50 400 } { 80 400 } { 50 600 } { 60 200 } } monitor-batch .
! => 2
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
Factor Exercism

مستعد لبدء أمان المصنع؟

سجّل في Exercism لتتعلّم وتتقن Factor عبر 47 مفهومًا163 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.