التعامل مع الأخطاء
باختصار: في ميم نوعان من الأخطاء. الخطأ المُعالَج قيمة ترجعها دالة قد تفشل (!نوع)، ويجب أن تعالجها عند الترجمة. وخطأ التشغيل (فهرس خارج القائمة، قسمة على صفر، تجاوز) خلل في البرنامج: لا يُعالَج، وينهيه برمز 3.
الكلمات الأربع
رابط إلى قسم «الكلمات الأربع»!نوعفي توقيع الدالة: قد تفشل. وعند الفشل ترجعخطأ.اسم، وأسماء أخطائك في كتلةاخطاء:.والا:ف() والا 0قيمة بديلة، وف() والا خ:ثم كتلة فيهاخاسم الخطأ (معحالات خلتمييزه)، وآخر سطر فيها القيمة البديلة.جرّب: داخل دالة!نوع، يمرّر الفشل إلى من استدعاها. وفي المستوى الأعلى ينهي البرنامج برمز 3 إن فشل.خاتمه_عند_خطأ: تنظيف لا يجري إلا إن خرجت الدالة بخطأ، وقبلخاتمهالمعلنة قبلها:
اخطاء: ملف_تالف
داله حمّل(صالح منطقي) !عدد: اطبع("فتح") خاتمه اطبع("إغلاق") خاتمه_عند_خطأ اطبع("تراجع عن نصف العمل") اذا !صالح: ارجع خطأ.ملف_تالف ارجع 42
اطبع(حمّل(صواب) والا -1)اطبع("---")اطبع(حمّل(خطاء) والا -1)ونسيان المعالجة خطأ ترجمة، فلا يصل إلى التشغيل برنامج فيه فشل لم تقرر ماذا تفعل به:
داله نصف(ن نص) !عدد: ارجع جرّب عدد(ن) / 2
اطبع(نصف("8"))رمز الخروج: 2
في فهرس الأخطاء: E0399
ومثال الكتاب المرجعي كاملاً:
اخطاء: رصيد_غير_كاف
داله اسحب(رصيد عدد, مبلغ عدد) !عدد: اذا مبلغ > رصيد: ارجع خطأ.رصيد_غير_كاف ارجع رصيد - مبلغ
داله سحبان(رصيد عدد, مبلغ عدد) !عدد: خاتمه_عند_خطأ اطبع("أُلغيت العملية") بعد_الاول = جرّب اسحب(رصيد, مبلغ) ارجع جرّب اسحب(بعد_الاول, مبلغ)
اطبع(سحبان(100, 30) والا -1)باقي = سحبان(50, 30) والا خ: حالات خ: حاله خطأ.رصيد_غير_كاف: اطبع("الرصيد لا يكفي") 0 حاله _: اطبع("خطأ آخر: ", خ) -1اطبع(باقي)ن = عدد("٤٢") والا 0اطبع(ن + 1, " ", عدد("س") والا -1)خطأ التشغيل ليس خطأً مُعالَجاً
رابط إلى قسم «خطأ التشغيل ليس خطأً مُعالَجاً»القسمة على صفر، والفهرس خارج القائمة، وتجاوز 64 بت، أخطاء برمجة: لا تُلتقط بـ والا، وتنهي البرنامج برمز 3 ومعرّف وسطر. ولا تُنفَّذ خاتمه عندها، فالملف المؤقت الذي كان سيُحذف يبقى على القرص:
داله احسب(ا عدد, ب عدد) عدد: خاتمه اطبع("تنظيف") ارجع ا / ب
اطبع(احسب(10, 2))اطبع(احسب(10, 0))رمز الخروج: 3
في فهرس الأخطاء: E0403
الحدود اليوم (0.10.0)
رابط إلى قسم «الحدود اليوم (0.10.0)»| الحد | ما يعنيه |
|---|---|
| الخطأ اسم بلا بيانات | لا «أي ملف» ولا «أي سطر» مع الخطأ؛ تحتاج متغيراً عاماً لنقل ذلك |
| مجموعة أخطاء واحدة | التوقيع لا يذكر أي الأخطاء ترجعها الدالة، وحالات على اسم لا ترجعه لا تُحذّر |
| لا سلسلة ولا سبب | تحويل الخطأ بين الطبقات يُضيع الخطأ الأصلي |
| لا تتبّع | «خطأ لم يُعالَج» يذكر سطر المستوى الأعلى لا موضع الفشل الأول، وخطأ التشغيل بلا مسار استدعاء |
خاتمه لا تقبل والا |
التنظيف الذي قد يفشل يحتاج دالة غلاف |
مؤشر دالة لا يرجع !نوع |
لا جداول معالجات تفشل |
errno من C غير متاح |
لا جسر مباشر لأخطاء مكتبات C |
والقوة: إلزام المعالجة عند الترجمة بثلاث كلمات قصيرة، وخاتمه_عند_خطأ بالترتيب الصحيح عبر الدوال، ولا كلفة على المسار الناجح. في السهولة والأمان قريبة من Zig، وفي التعبير أضعف من Rust وGo لأن الخطأ بلا بيانات.
اقرأ أيضاً
رابط إلى قسم «اقرأ أيضاً»الدرس 16: معالجة الأخطاء · معالجة الأخطاء في المرجع · فهرس الأخطاء · الترحيل إلى معالجة الأخطاء