هذه المشاركة لأخينا وصديقنا العزيز الأستاذ تركي العسيري من منتديات فيجول بيسيك للعرب
وباسمي وباسم كل أعضاء الإبداع أشكره على هذا الجهد المميز
ونسأل الله أن يجازيه خير الجزاء
مما لا شك فيه أن أحد أسباب انتشار الشعيرات البيضاء في رؤوس المبرمجين هي الأخطاء البرمجية ... فكم من مبرمج كسر شاشة جهازه بسبب كثرة الاخطاء غير المتداركة في برنامجه، وكم من مبرمج أوقف تكملة مشاريعه بسبب عدم معرفة مصدر الخطأ ..
إن كتابة برنامج دون أخطاء شئ يتحقق في الخيال فقط! لكن قد تجد أساليب في هذه المقالة لتخفيف الاخطاء والمشاكل البرمجية في برنامجك.
فكرة عامة
تصنف الأخطاء في أي لغة برمجة إلى قسمين على أساس وقت حدوثها: إما في وقت التصميم أو وقت التنفيذ.
هذه الأخطاء تسبب انهيار برنامجك وإنهاء تنفيذه، بالإضافة إلى ذلك، يوجد نوع من الأخطاء التي لا تظهر لك بشكل مباشر تعرف بالشوائب، والآن لنلق نظرة على هذه الأنواع:
أخطاء وقت التصميم Design Time Errors
وقد تسمى أيضا بالأخطاء النحوية Syntax Errors وهي أسهل أنواع الأخطاء اكتشافا وإصلاحا، ويكون وقت حدوث هذه الأخطاء في مرحلة التصميم أو الترجمة للبرنامج، وسببها الرئيسي في طريقة كتابة العبارات البرمجية الخاطئة، فمثلا قد تكتب اسم دالة ليست موجودة، أو تنشئ حلقة For بدون إقفالها باستخدام Next، أو .. أو .. الخ.
توفر لك بيئة التطوير المتكاملة لـ Visual Basic اداة في قمة الروعة هدفها قنص هذه الاخطاء تلقائيا بمجرد الوقوع فيها وذلك بعد الضغط على المفتاح ENTER، مثلا قم بكتابة X == 4 واضغط مفتاح الادخال ستلاحظ ظهور رسالة توضح لك الخطأ وقد قلب لون السطر بالاحمر، وتعرف هذه الميزة بالتدقيق النحوي التلقائي Auto Syntax Check والتي تستطيع إلغاءها عن طريق الاختيار Auto Syntax Check الموجود في خانة التبويب Editor في نافذة الخيارات Options، ولا أعتقد انك ستلغيها في يوم من الايام .. أليس كذلك؟!
أخطاء وقت التنفيذ Run Time Errors
وقت ظهور هذه الأخطاء مختلف، فلن تظهر الرسالة المزعجة وقت كتابة الكود وإنما في وقت التنفيذ (أي بعد الضغط على F5) ..
عندما يصل المفسر إلى سطر صحيح نحويا لكنه خاطئ منطقيا ستظهر رسالة مفيدة بعنوان Run Time Error ويظهر تحديد لمكان السطر الذي وقع فيه الخطأ، مثلا اكتب هذا الكود:
من الواضح أن الصيغة النحوية لهذا الكود صحيحة لكن منطقيا خطأ! جرب تنفيذ البرنامج وستلاحظ ظهور رسالة خطأ OverFlow بسبب أن القيمة القصوى التي يحملها أي متغير من نوع Byte هي 255، طبعا أخطاء وقت التنفيذ كثيرة جداً جداً، فأنت عندما تصمم البرنامج تتوقع أن كل الاحتمالات الخارجية كما هي في حالة تصميم البرنامج. مثلا لو وجد في أحد سطور برنامج أمر يقوم بمسح ملف معين وكتبت هذا الكود:
إنه يعمل بالشكل المطلوب، لكن لنفترض أن الملف لم يكن موجوداً؟ فان رسالة الخطأ سيكون لها نصيب من عمر تنفيذ البرنامج. فلو كنت ذكيا ستتأكد من وجود الملف باستخدام دالة Dir ومن ثم حذفه:
يبدو ان ذكائك خارق جدا يا قارئ هذه السطور لكن مهلا كاتب هذه السطور لديه شئ اخر ليخبرك به .. ماذا لو كان الملف موجود لكن خاصية ReadOnly مدعومة به أي أنه غير قابل للحذف؟؟ ارأيت رسالة الخطأ ستظهر من جديد. اذا ستستخدم ذكائك الخارق وتتأكد من وجود الملف ومن ثم من عدم وجود خاصية ReadOnly:
حسنا يا قارئي الفاضل. لك مني فائق التقدير والاحترام على محاولتك الرائعة لتجنب الخطأ لكن مع ذلك فهناك احتمال آخر لوقوع الخطأ!!! افترض ان الملف FileName.EXT يتم استخدامه من قبل برنامج آخر Process وكانت عليه خاصية الاقفال (أي مسموح للبرنامج الذي يستخدمه فقط) فانك لن تستطيع فتح الملف وستظهر رسالة الخطأ التي أخبرتك بها وأكون قد غلبتك في هذا التحدي.
القضية ليست من يغلب من، فكلنا مبرمجين ننسى كثيرا، لكن لابد لأي مبرمج وضع جميع وكافة الاحتمالات الممكنة لتفادي وتجنب الاخطاء كما سنرى لاحقا.
الشوائب Bugs
قد يكون الكود سليم من ناحية نحوية ولا توجد به أي اخطاء في وقت التنفيذ لكن به شوائب، فلا يوجد برنامج إلا وبه شوائب، والشوائب هي أخطاء في سلوك تنفيذ البرنامج لكنها لا تسبب في إيقافه، وهي صعبة الإيجاد والاكتشاف، لذلك نجد غالبا في البرامج التجارية الكبيرة صدور نسخ تجريبية Beta توزع على أشخاص وشركات معينة والهدف منها تجربة البرنامج والتحقق من واكتشاف الشوائب الموجودة فيه، ومن أكبر الاخطاء الذي يقع فيها المبرمج هي محاولة اكتشاف الشوائب بنفسه! والصحيح لن تستطيع اكتشاف الشوائب إلا عن طريق غيرك، ففي حالة تجربة برامجك الشخصية فإنك أكثر من يعرف طريقة التعامل معها، لكن في حالة وجود نسخة من البرنامج عند شخص اخر فالوضع يختلف، وتبدأ الشوائب بالظهور لديه.
Visual Basic به شوائب!!! هناك الكثير من الشوائب التي تكتشف شهريا وتصدر شركة Microsoft تقارير عنها تجدها بشكل دوري في مكتبة MSDN، بعضها تم إصلاحه وبعضها لا، المقصد من هذا الكلام أنه مهما كان مستواك في البرمجة لابد من وجود شوائب في برنامجك.
يوجد الكثير من الكتب التي تناقش مسألة الشوائب البرمجية وكيفية تفاديها أقصد الإقلال منها، وسأحاول في نهاية هذه المقالة إعطاءك تلميحات شخصية قد تفيدك لتجنب الشوائب.
تفادي الاخطاء
الكائن Err
عوداً إلى موضوع أخطاء وقت التشغيل وبالتحديد في مثال الملف FileName.EXT، بدلا من كتابة عشرات الأسطر للتأكد من قابلية حذف الملف، استخدم كائن الخطأ Err ..
وقبل تطبيق هذا الكائن لا بد من معرفة أن كل خطأ من اخطاء وقت التشغيل له رقم خاص به ووصفه، وعند حدوث الخطأ يتم وضع هذه البيانات (الخاصة بالخطأ) في الكائن Err ..
عند رغبتك في الاستمرار في عملية تنفيذ البرنامج حتى عند وقوع الخطأ لابد من كتابة التعليمة On Error Resume Next عند بداية كل اجراء حتى يستمر في تنفيذ سطور البرنامج وهي افضل من On Error Goto X .. راقب هذا المثال:
هنا سنقوم بمحاولة حذف الملف، وإن لم يستطع البرنامج فعل ذلك فان الكائن Err سيحتوي على خصائص تتعلق بذلك الخطأ. كما تلاحظ، سنظهر رسالة توضح وصف الخطأ. من المهم التأكد من تنظيف الكائن Err عن طريق استدعاء الطريقة Clear حتى تخبر البرنامج أننا انتهينا من قنص الخطأ وأنه لا يوجد خطأ آخر.
طريقة مفيدة لتجنب الشوائب
تجنب الشوائب يحتاج الى كتب لا نهاية لها! الا أنني ساعرض لك طريقة معروفة لمحاولة معرفة أسباب حدوث الشوائب وإصلاحها وهي التنفيذ خطوة خطوة! المقصد تنفيذ سطر تلو الاخر عن طريق الضغط على مفتاح F8 للانتقال الى تنفيذ السطر التالي او Shift + F8 لتنفيذ اجراء كامل، ومن المهم أن أذكر هنا أن بعض الأحداث كـ KeyUp و غيرها لن يتم تنفيذها بالشكل الصحيح، بالإضافة إلى ذلك اجعل قيمة الخاصية Interval لأداة المؤقت Timer مساوية للصفر حتى لا تزعجك كثرة الانتقال إلى كود الاداة. أيضا ألق نظرة على قائمة Debug ستجد فيها الكثير من الخدمات الفعالة كمراقبة قيم المتغيرات وتحديد نقاط الإيقاف المؤقت للبرنامج .. الخ.
خاتمة
ناقشت في هذه المقالة موضوع الاخطاء وصنفتها حسب وقت حدوثها. كما تطرقت إلى موضوع الشوائب وهو موضوع كبير لا نهاية له وطريقة التنفيذ خطوة خطوة لمعرفة أسباب حدوثها.
منقول من منتدى فيجول بيسيك للعرب
وباسمي وباسم كل أعضاء الإبداع أشكره على هذا الجهد المميز
ونسأل الله أن يجازيه خير الجزاء
مما لا شك فيه أن أحد أسباب انتشار الشعيرات البيضاء في رؤوس المبرمجين هي الأخطاء البرمجية ... فكم من مبرمج كسر شاشة جهازه بسبب كثرة الاخطاء غير المتداركة في برنامجه، وكم من مبرمج أوقف تكملة مشاريعه بسبب عدم معرفة مصدر الخطأ ..
إن كتابة برنامج دون أخطاء شئ يتحقق في الخيال فقط! لكن قد تجد أساليب في هذه المقالة لتخفيف الاخطاء والمشاكل البرمجية في برنامجك.
فكرة عامة
تصنف الأخطاء في أي لغة برمجة إلى قسمين على أساس وقت حدوثها: إما في وقت التصميم أو وقت التنفيذ.
هذه الأخطاء تسبب انهيار برنامجك وإنهاء تنفيذه، بالإضافة إلى ذلك، يوجد نوع من الأخطاء التي لا تظهر لك بشكل مباشر تعرف بالشوائب، والآن لنلق نظرة على هذه الأنواع:
أخطاء وقت التصميم Design Time Errors
وقد تسمى أيضا بالأخطاء النحوية Syntax Errors وهي أسهل أنواع الأخطاء اكتشافا وإصلاحا، ويكون وقت حدوث هذه الأخطاء في مرحلة التصميم أو الترجمة للبرنامج، وسببها الرئيسي في طريقة كتابة العبارات البرمجية الخاطئة، فمثلا قد تكتب اسم دالة ليست موجودة، أو تنشئ حلقة For بدون إقفالها باستخدام Next، أو .. أو .. الخ.
توفر لك بيئة التطوير المتكاملة لـ Visual Basic اداة في قمة الروعة هدفها قنص هذه الاخطاء تلقائيا بمجرد الوقوع فيها وذلك بعد الضغط على المفتاح ENTER، مثلا قم بكتابة X == 4 واضغط مفتاح الادخال ستلاحظ ظهور رسالة توضح لك الخطأ وقد قلب لون السطر بالاحمر، وتعرف هذه الميزة بالتدقيق النحوي التلقائي Auto Syntax Check والتي تستطيع إلغاءها عن طريق الاختيار Auto Syntax Check الموجود في خانة التبويب Editor في نافذة الخيارات Options، ولا أعتقد انك ستلغيها في يوم من الايام .. أليس كذلك؟!
أخطاء وقت التنفيذ Run Time Errors
وقت ظهور هذه الأخطاء مختلف، فلن تظهر الرسالة المزعجة وقت كتابة الكود وإنما في وقت التنفيذ (أي بعد الضغط على F5) ..
عندما يصل المفسر إلى سطر صحيح نحويا لكنه خاطئ منطقيا ستظهر رسالة مفيدة بعنوان Run Time Error ويظهر تحديد لمكان السطر الذي وقع فيه الخطأ، مثلا اكتب هذا الكود:
من الواضح أن الصيغة النحوية لهذا الكود صحيحة لكن منطقيا خطأ! جرب تنفيذ البرنامج وستلاحظ ظهور رسالة خطأ OverFlow بسبب أن القيمة القصوى التي يحملها أي متغير من نوع Byte هي 255، طبعا أخطاء وقت التنفيذ كثيرة جداً جداً، فأنت عندما تصمم البرنامج تتوقع أن كل الاحتمالات الخارجية كما هي في حالة تصميم البرنامج. مثلا لو وجد في أحد سطور برنامج أمر يقوم بمسح ملف معين وكتبت هذا الكود:
إنه يعمل بالشكل المطلوب، لكن لنفترض أن الملف لم يكن موجوداً؟ فان رسالة الخطأ سيكون لها نصيب من عمر تنفيذ البرنامج. فلو كنت ذكيا ستتأكد من وجود الملف باستخدام دالة Dir ومن ثم حذفه:
يبدو ان ذكائك خارق جدا يا قارئ هذه السطور لكن مهلا كاتب هذه السطور لديه شئ اخر ليخبرك به .. ماذا لو كان الملف موجود لكن خاصية ReadOnly مدعومة به أي أنه غير قابل للحذف؟؟ ارأيت رسالة الخطأ ستظهر من جديد. اذا ستستخدم ذكائك الخارق وتتأكد من وجود الملف ومن ثم من عدم وجود خاصية ReadOnly:
حسنا يا قارئي الفاضل. لك مني فائق التقدير والاحترام على محاولتك الرائعة لتجنب الخطأ لكن مع ذلك فهناك احتمال آخر لوقوع الخطأ!!! افترض ان الملف FileName.EXT يتم استخدامه من قبل برنامج آخر Process وكانت عليه خاصية الاقفال (أي مسموح للبرنامج الذي يستخدمه فقط) فانك لن تستطيع فتح الملف وستظهر رسالة الخطأ التي أخبرتك بها وأكون قد غلبتك في هذا التحدي.
القضية ليست من يغلب من، فكلنا مبرمجين ننسى كثيرا، لكن لابد لأي مبرمج وضع جميع وكافة الاحتمالات الممكنة لتفادي وتجنب الاخطاء كما سنرى لاحقا.
الشوائب Bugs
قد يكون الكود سليم من ناحية نحوية ولا توجد به أي اخطاء في وقت التنفيذ لكن به شوائب، فلا يوجد برنامج إلا وبه شوائب، والشوائب هي أخطاء في سلوك تنفيذ البرنامج لكنها لا تسبب في إيقافه، وهي صعبة الإيجاد والاكتشاف، لذلك نجد غالبا في البرامج التجارية الكبيرة صدور نسخ تجريبية Beta توزع على أشخاص وشركات معينة والهدف منها تجربة البرنامج والتحقق من واكتشاف الشوائب الموجودة فيه، ومن أكبر الاخطاء الذي يقع فيها المبرمج هي محاولة اكتشاف الشوائب بنفسه! والصحيح لن تستطيع اكتشاف الشوائب إلا عن طريق غيرك، ففي حالة تجربة برامجك الشخصية فإنك أكثر من يعرف طريقة التعامل معها، لكن في حالة وجود نسخة من البرنامج عند شخص اخر فالوضع يختلف، وتبدأ الشوائب بالظهور لديه.
Visual Basic به شوائب!!! هناك الكثير من الشوائب التي تكتشف شهريا وتصدر شركة Microsoft تقارير عنها تجدها بشكل دوري في مكتبة MSDN، بعضها تم إصلاحه وبعضها لا، المقصد من هذا الكلام أنه مهما كان مستواك في البرمجة لابد من وجود شوائب في برنامجك.
يوجد الكثير من الكتب التي تناقش مسألة الشوائب البرمجية وكيفية تفاديها أقصد الإقلال منها، وسأحاول في نهاية هذه المقالة إعطاءك تلميحات شخصية قد تفيدك لتجنب الشوائب.
تفادي الاخطاء
الكائن Err
عوداً إلى موضوع أخطاء وقت التشغيل وبالتحديد في مثال الملف FileName.EXT، بدلا من كتابة عشرات الأسطر للتأكد من قابلية حذف الملف، استخدم كائن الخطأ Err ..
وقبل تطبيق هذا الكائن لا بد من معرفة أن كل خطأ من اخطاء وقت التشغيل له رقم خاص به ووصفه، وعند حدوث الخطأ يتم وضع هذه البيانات (الخاصة بالخطأ) في الكائن Err ..
عند رغبتك في الاستمرار في عملية تنفيذ البرنامج حتى عند وقوع الخطأ لابد من كتابة التعليمة On Error Resume Next عند بداية كل اجراء حتى يستمر في تنفيذ سطور البرنامج وهي افضل من On Error Goto X .. راقب هذا المثال:
هنا سنقوم بمحاولة حذف الملف، وإن لم يستطع البرنامج فعل ذلك فان الكائن Err سيحتوي على خصائص تتعلق بذلك الخطأ. كما تلاحظ، سنظهر رسالة توضح وصف الخطأ. من المهم التأكد من تنظيف الكائن Err عن طريق استدعاء الطريقة Clear حتى تخبر البرنامج أننا انتهينا من قنص الخطأ وأنه لا يوجد خطأ آخر.
طريقة مفيدة لتجنب الشوائب
تجنب الشوائب يحتاج الى كتب لا نهاية لها! الا أنني ساعرض لك طريقة معروفة لمحاولة معرفة أسباب حدوث الشوائب وإصلاحها وهي التنفيذ خطوة خطوة! المقصد تنفيذ سطر تلو الاخر عن طريق الضغط على مفتاح F8 للانتقال الى تنفيذ السطر التالي او Shift + F8 لتنفيذ اجراء كامل، ومن المهم أن أذكر هنا أن بعض الأحداث كـ KeyUp و غيرها لن يتم تنفيذها بالشكل الصحيح، بالإضافة إلى ذلك اجعل قيمة الخاصية Interval لأداة المؤقت Timer مساوية للصفر حتى لا تزعجك كثرة الانتقال إلى كود الاداة. أيضا ألق نظرة على قائمة Debug ستجد فيها الكثير من الخدمات الفعالة كمراقبة قيم المتغيرات وتحديد نقاط الإيقاف المؤقت للبرنامج .. الخ.
خاتمة
ناقشت في هذه المقالة موضوع الاخطاء وصنفتها حسب وقت حدوثها. كما تطرقت إلى موضوع الشوائب وهو موضوع كبير لا نهاية له وطريقة التنفيذ خطوة خطوة لمعرفة أسباب حدوثها.
منقول من منتدى فيجول بيسيك للعرب