الفصل 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)
نتيجة = نتيجة + نص_أصلي[م]
نهاية
ارجع نتيجة
نهاية