تخطَّ إلى المحتوى

التعامل مع الأخطاء

باختصار: في ميم نوعان من الأخطاء. الخطأ المُعالَج قيمة ترجعها دالة قد تفشل (!نوع)، ويجب أن تعالجها عند الترجمة. وخطأ التشغيل (فهرس خارج القائمة، قسمة على صفر، تجاوز) خلل في البرنامج: لا يُعالَج، وينهيه برمز 3.

ف() ترجع !عددنجاح: القيمة · فشل: خطأ.اسمن = ف() والا 0يُعالَج هنا، ويستمر البرنامجن = جرّب ف()يصعد إلى من استدعى الدالةالمستوى الأعلى بلا معالجة«خطأ لم يُعالَج»، رمز 3
الخطأ المعالَج له طريقان: يُعالَج في موضعه بـ«والا»، أو يصعد بـ«جرّب». وما يصل إلى المستوى الأعلى بلا معالجة ينهي البرنامج برمز 3.
  • !نوع في توقيع الدالة: قد تفشل. وعند الفشل ترجع خطأ.اسم، وأسماء أخطائك في كتلة اخطاء:.
  • والا: ف() والا 0 قيمة بديلة، وف() والا خ: ثم كتلة فيها خ اسم الخطأ (مع حالات خ لتمييزه)، وآخر سطر فيها القيمة البديلة.
  • جرّب: داخل دالة !نوع، يمرّر الفشل إلى من استدعاها. وفي المستوى الأعلى ينهي البرنامج برمز 3 إن فشل.
  • خاتمه_عند_خطأ: تنظيف لا يجري إلا إن خرجت الدالة بخطأ، وقبل خاتمه المعلنة قبلها:
خاتمه وخاتمه_عند_خطأ
اخطاء:
ملف_تالف
داله حمّل(صالح منطقي) !عدد:
اطبع("فتح")
خاتمه اطبع("إغلاق")
خاتمه_عند_خطأ اطبع("تراجع عن نصف العمل")
اذا !صالح:
ارجع خطأ.ملف_تالف
ارجع 42
اطبع(حمّل(صواب) والا -1)
اطبع("---")
اطبع(حمّل(خطاء) والا -1)
مخرجات مسجّلة من المجمّعmeem اخطاء_عند_خطأ.م · meem 0.10.0+b01b55f
فتحإغلاق42---فتحتراجع عن نصف العملإغلاق-1

ونسيان المعالجة خطأ ترجمة، فلا يصل إلى التشغيل برنامج فيه فشل لم تقرر ماذا تفعل به:

نتيجة !عدد بلا معالجة
داله نصف(ن نص) !عدد:
ارجع جرّب عدد(ن) / 2
اطبع(نصف("8"))
مخرجات مسجّلة من المجمّعmeem 15_غير_معالج.م · meem 0.10.0+b01b55f
​[خطأ دلالي E0399] سطر 4:6 - 'نصف(...)' من النوع '!عدد' (قد يفشل) ولا يُستعمل كأنه 'عدد'   4 | اطبع(نصف("8"))     |      ^~~  تلميح: عالج الخطأ في موضعه:  جرّب نصف(...)  (يمرّر الخطأ إلى مستدعي الدالة)   أو   نصف(...) والا قيمة_بديلة   أو   نصف(...) والا خ:  ثم كتلة تعالج «خ»

رمز الخروج: 2

في فهرس الأخطاء: E0399

ومثال الكتاب المرجعي كاملاً:

مثال
اخطاء:
رصيد_غير_كاف
داله اسحب(رصيد عدد, مبلغ عدد) !عدد:
اذا مبلغ > رصيد:
ارجع خطأ.رصيد_غير_كاف
ارجع رصيد - مبلغ
داله سحبان(رصيد عدد, مبلغ عدد) !عدد:
خاتمه_عند_خطأ اطبع("أُلغيت العملية")
بعد_الاول = جرّب اسحب(رصيد, مبلغ)
ارجع جرّب اسحب(بعد_الاول, مبلغ)
اطبع(سحبان(100, 30) والا -1)
باقي = سحبان(50, 30) والا خ:
حالات خ:
حاله خطأ.رصيد_غير_كاف:
اطبع("الرصيد لا يكفي")
0
حاله _:
اطبع("خطأ آخر: ", خ)
-1
اطبع(باقي)
ن = عدد("٤٢") والا 0
اطبع(ن + 1, " ", عدد("س") والا -1)
المخرج المسجَّل في الكتاب المرجعيmeem برنامج.م · 0.10.0
40أُلغيت العمليةالرصيد لا يكفي043 -1

خطأ التشغيل ليس خطأً مُعالَجاً

رابط إلى قسم «خطأ التشغيل ليس خطأً مُعالَجاً»

القسمة على صفر، والفهرس خارج القائمة، وتجاوز 64 بت، أخطاء برمجة: لا تُلتقط بـ والا، وتنهي البرنامج برمز 3 ومعرّف وسطر. ولا تُنفَّذ خاتمه عندها، فالملف المؤقت الذي كان سيُحذف يبقى على القرص:

خاتمه لا تُنفَّذ عند خطأ التشغيل
داله احسب(ا عدد, ب عدد) عدد:
خاتمه اطبع("تنظيف")
ارجع ا / ب
اطبع(احسب(10, 2))
اطبع(احسب(10, 0))
مخرجات مسجّلة من المجمّعmeem اخطاء_تشغيل.م · meem 0.10.0+b01b55f
تنظيف5
[خطأ تشغيل E0403] سطر 3:12 - القسمة على صفر      ارجع ا / ب

رمز الخروج: 3

في فهرس الأخطاء: E0403

الحد ما يعنيه
الخطأ اسم بلا بيانات لا «أي ملف» ولا «أي سطر» مع الخطأ؛ تحتاج متغيراً عاماً لنقل ذلك
مجموعة أخطاء واحدة التوقيع لا يذكر أي الأخطاء ترجعها الدالة، وحالات على اسم لا ترجعه لا تُحذّر
لا سلسلة ولا سبب تحويل الخطأ بين الطبقات يُضيع الخطأ الأصلي
لا تتبّع «خطأ لم يُعالَج» يذكر سطر المستوى الأعلى لا موضع الفشل الأول، وخطأ التشغيل بلا مسار استدعاء
خاتمه لا تقبل والا التنظيف الذي قد يفشل يحتاج دالة غلاف
مؤشر دالة لا يرجع !نوع لا جداول معالجات تفشل
errno من C غير متاح لا جسر مباشر لأخطاء مكتبات C

والقوة: إلزام المعالجة عند الترجمة بثلاث كلمات قصيرة، وخاتمه_عند_خطأ بالترتيب الصحيح عبر الدوال، ولا كلفة على المسار الناجح. في السهولة والأمان قريبة من Zig، وفي التعبير أضعف من Rust وGo لأن الخطأ بلا بيانات.

الدرس 16: معالجة الأخطاء · معالجة الأخطاء في المرجع · فهرس الأخطاء · الترحيل إلى معالجة الأخطاء