Skip to content

الفصل 31: تنقيح الأخطاء (Debugging)

مقدمة

تنقيح الأخطاء هو مهارة أساسية لكل مبرمج. في هذا الفصل سنتعلم تقنيات وأدوات تنقيح الأخطاء في لغة ص.

أنواع الأخطاء

أخطاء نحوية

الأخطاء النحوية هي الأسهل اكتشافاً لأن المفسر يشير إلى مكانها.

sad
# خطأ: نسيان كلمة نهاية
دالة جمع(أ، ب)
    ارجع أ + ب
# ← هنا يجب إضافة: نهاية

أخطاء وقت التشغيل

تحدث أثناء تنفيذ البرنامج:

sad
دالة قسمة(أ، ب)
    إذا (ب == 0)
        ارمي "لا يمكن القسمة على صفر"
    نهاية
    ارجع أ / ب
نهاية

# هذا سيسبب خطأ وقت التشغيل
حاول
    متغير نتيجة = قسمة(10، 0)
امسك (خطأ)
    اطبع_سطر("خطأ: " + خطأ)
نهاية

أخطاء منطقية

أصعب الأخطاء لأن البرنامج يعمل بدون أخطاء لكن ينتج نتائج خاطئة:

sad
# خطأ منطقي: المقارنة خاطئة
دالة هل_بالغ(عمر)
    ارجع عمر < 18  # يجب أن تكون >= 18
نهاية

تقنيات التنقيح

الطباعة التشخيصية

أبسط وأشهر تقنية:

sad
دالة ترتيب_فقاعي(مصفوفة)
    متغير ن = طول(مصفوفة)
    اطبع_سطر("[تنقيح] طول المصفوفة: " + ن)
    
    لكل م في مدى(0، ن - 1)
        لكل ك في مدى(0، ن - م - 1)
            اطبع_سطر("[تنقيح] مقارنة " + مصفوفة[ك] + " مع " + مصفوفة[ك + 1])
            إذا (مصفوفة[ك] > مصفوفة[ك + 1])
                متغير مؤقت = مصفوفة[ك]
                مصفوفة[ك] = مصفوفة[ك + 1]
                مصفوفة[ك + 1] = مؤقت
            نهاية
        نهاية
    نهاية
    ارجع مصفوفة
نهاية

التحقق من الأنواع

sad
دالة معالجة(بيانات)
    اطبع_سطر("[تنقيح] نوع البيانات: " + نوع(بيانات))
    
    طابق (نوع(بيانات))
        عندما "رقم":
            ارجع بيانات * 2
        عندما "نص":
            ارجع طول(بيانات)
        افتراضي:
            ارمي "نوع غير مدعوم: " + نوع(بيانات)
    نهاية
نهاية

التسجيل المنظم

sad
صنف سجل
    ساكن دالة معلومة(رسالة)
        اطبع_سطر("[معلومة] " + رسالة)
    نهاية
    
    ساكن دالة تحذير(رسالة)
        اطبع_سطر("[تحذير] " + رسالة)
    نهاية
    
    ساكن دالة خطأ(رسالة)
        اطبع_سطر("[خطأ] " + رسالة)
    نهاية
نهاية

# الاستخدام
سجل.معلومة("بدأ تحميل الملف")
سجل.تحذير("الملف كبير جداً")
سجل.خطأ("فشل في فتح الملف")

تتبع المكدس

عند حدوث خطأ، استخدم حاول/امسك لالتقاط معلومات الخطأ:

sad
دالة أ()
    ارمي "خطأ في الدالة أ"
نهاية

دالة ب()
    أ()
نهاية

دالة ج()
    ب()
نهاية

حاول
    ج()
امسك (خطأ)
    اطبع_سطر("تتبع الخطأ: " + خطأ)
نهاية

نصائح عملية

التقنيةمتى تُستخدم
طباعة تشخيصيةأخطاء بسيطة وسريعة
تسجيل منظممشاريع كبيرة
اختبارات وحدةمنع تكرار الأخطاء
مراجعة الكودأخطاء منطقية

تمرين

البرنامج التالي به خطأ منطقي. اكتشفه وأصلحه:

sad
دالة معكوس(نص_أصلي)
    متغير نتيجة = ""
    لكل م في مدى(طول(نص_أصلي)، 0)
        نتيجة = نتيجة + نص_أصلي[م]
    نهاية
    ارجع نتيجة
نهاية
الحل
sad
# الخطأ: مدى يبدأ من طول-1 وليس طول
دالة معكوس(نص_أصلي)
    متغير نتيجة = ""
    لكل م في مدى(طول(نص_أصلي) - 1، -1)
        نتيجة = نتيجة + نص_أصلي[م]
    نهاية
    ارجع نتيجة
نهاية

مُرخَّص بموجب رخصة MIT