مفهوم معالجة الأخطاء
معالجة الأخطاء ( Exceptions Handling ) يقصد منها كتابة الكود الذي قد يسبب أي مشكلة في البرنامج بطريقة تضمن أنه إذا حدث الخطأ المتوقع أو أي خطأ آخر فإن البرنامج لن يعلّق أو يتم إغلاقه بشكل فجائي.
ظهور خطأ في البرنامج بشكل مفاجئ هو أمر سيئ جداً لأنه يؤدي إلى نفور عدد كبير من المستخدمين و عدم رغبتهم في العودة إلى استخدام هذا البرنامج مجدداً.
معالجة الأخطاء ( Exceptions Handling ) يقصد منها كتابة الكود الذي قد يسبب أي مشكلة في البرنامج بطريقة تضمن أنه إذا حدث الخطأ المتوقع أو أي خطأ آخر فإن البرنامج لن يعلّق أو يتم إغلاقه بشكل فجائي.
ظهور خطأ في البرنامج بشكل مفاجئ هو أمر سيئ جداً لأنه يؤدي إلى نفور عدد كبير من المستخدمين و عدم رغبتهم في العودة إلى استخدام هذا البرنامج مجدداً.
أنواع الأخطاء
- أخطاء تظهر لك أثناء كتابة الكود. هذه الأخطاء يقال لها أخطاء لغوية ( Syntax Errors ).
- أخطاء تحدث أثناء تشغيل البرنامج مما يؤدي إلى تعليقه و إيقافه بشكل غير طبيعي. هذه الأخطاء يقال لها إستثناءات ( Exceptions ).
- أخطاء منطقية ( Logical Errors ), و يقصد منها أن الكود يعمل بدون أي مشاكل لكن نتيجة تشغيل هذا الكود غير صحيحة.
إذاً, أي خطأ برمجي يحدث معك أثناء تشغيل البرنامج يقال له إستثناء ( Exception ) حتى إن كان إسم الخطأ يحتوي على كلمة
.
بمعنى آخر, أي Error يظهر لك أثناء تشغيل البرنامج يعتبر Exception.في هذا الدرس ستتعلم كيف تتجنب حدوث أخطاء في البرامج التي تكتبها, و فعلياً ستتعلم كيف تجهز البرنامج للتعامل مع الأخطاء التي قد تحدث أثناء تشغيله لجعل البرنامج شغال دائماً في نظر المستخدم و لا يظهر له أي أخطاء.
- أخطاء تظهر لك أثناء كتابة الكود. هذه الأخطاء يقال لها أخطاء لغوية ( Syntax Errors ).
- أخطاء تحدث أثناء تشغيل البرنامج مما يؤدي إلى تعليقه و إيقافه بشكل غير طبيعي. هذه الأخطاء يقال لها إستثناءات ( Exceptions ).
- أخطاء منطقية ( Logical Errors ), و يقصد منها أن الكود يعمل بدون أي مشاكل لكن نتيجة تشغيل هذا الكود غير صحيحة.
إذاً, أي خطأ برمجي يحدث معك أثناء تشغيل البرنامج يقال له إستثناء ( Exception ) حتى إن كان إسم الخطأ يحتوي على كلمة
.بمعنى آخر, أي Error يظهر لك أثناء تشغيل البرنامج يعتبر Exception.
في هذا الدرس ستتعلم كيف تتجنب حدوث أخطاء في البرامج التي تكتبها, و فعلياً ستتعلم كيف تجهز البرنامج للتعامل مع الأخطاء التي قد تحدث أثناء تشغيله لجعل البرنامج شغال دائماً في نظر المستخدم و لا يظهر له أي أخطاء.
بعض الأسباب التي تسبب حدوث إستثناء
- في حال إدخال رقم index غير موجود في مصفوفة أو في متغير نصي.
- في حال كان البرنامج يتصل بالشبكة و فجأةً إنقطع الإتصال.
- في حال كان البرنامج يحاول قراءة معلومات من ملف نصي, و كان هذا الملف غير موجود.
- في حال إدخال رقم index غير موجود في مصفوفة أو في متغير نصي.
- في حال كان البرنامج يتصل بالشبكة و فجأةً إنقطع الإتصال.
- في حال كان البرنامج يحاول قراءة معلومات من ملف نصي, و كان هذا الملف غير موجود.
أمثلة على أنواع الأخطاء
مثال يتضمن خطأ لغوي ( Syntax Error )
في المثال التالي وضعنا قوس إضافي لدالة الطباعة, حيث أننا كتبنا
بدلاً من .
في المثال التالي وضعنا قوس إضافي لدالة الطباعة, حيث أننا كتبنا
بدلاً من .مثال
سنحصل على النتيجة التالية عند تشغيل الملف
.
سنحصل على النتيجة التالية عند تشغيل الملف
.ملاحظة
برنامج PyCharm يضع لك خطأ أحمر يوضح لك تماماً أين يوجد خطأ لغوي قبل تشغيل البرنامج.
في حال تشغيل البرنامج بدون إصلاح الخطأ ستجد أن مفسر لغة بايثون أيضاً يضع لك سهم أحمر ^ يخبرك أين وجد عندك خطأ لغوي في الكود عندما حاول تنفيذه.
برنامج PyCharm يضع لك خطأ أحمر يوضح لك تماماً أين يوجد خطأ لغوي قبل تشغيل البرنامج.
في حال تشغيل البرنامج بدون إصلاح الخطأ ستجد أن مفسر لغة بايثون أيضاً يضع لك سهم أحمر ^ يخبرك أين وجد عندك خطأ لغوي في الكود عندما حاول تنفيذه.
أمثلة تتضمن أخطاء برمجية ( Exceptions )
في المثال التالي قمنا بطباعة قيمة متغير لم نقوم أصلاً بإعطاءه قيمة!
ملاحظة: هنا سيحدث الخطأ وقت التشغيل عندما يكتشف مفسّر لغة بايثون أن المتغير لا يحتوي على قيمة.
في المثال التالي قمنا بطباعة قيمة متغير لم نقوم أصلاً بإعطاءه قيمة!
ملاحظة: هنا سيحدث الخطأ وقت التشغيل عندما يكتشف مفسّر لغة بايثون أن المتغير لا يحتوي على قيمة.
المثال الأول
سنحصل على النتيجة التالية عند تشغيل الملف
.
في المثال التالي قمنا بتعريف
إسمه و يتألف من ,4 عناصر.
بعدها حاولنا طباعة قيمة كل عنصر فيه و حاولنا طباعة قيمة عنصر غير موجود!
ملاحظة: هنا سيحدث الخطأ وقت التشغيل عندما يكتشف مفسّر لغة بايثون أنه لا يوجد عنصر يملك Index يساوي 4 في الكائن .
سنحصل على النتيجة التالية عند تشغيل الملف
.في المثال التالي قمنا بتعريف
إسمه و يتألف من ,4 عناصر.بعدها حاولنا طباعة قيمة كل عنصر فيه و حاولنا طباعة قيمة عنصر غير موجود!
ملاحظة: هنا سيحدث الخطأ وقت التشغيل عندما يكتشف مفسّر لغة بايثون أنه لا يوجد عنصر يملك Index يساوي 4 في الكائن .
المثال الثاني
سنحصل على النتيجة التالية عند تشغيل الملف
.
سنحصل على النتيجة التالية عند تشغيل الملف
.مثال يتضمن خطأ منطقي ( Logical Error )
في المثال التالي قمنا بإنشاء برنامج يطبع للطالب ما إذا كان ناجحاً أو راسباً بناءاً على معدله النهائي.
من المفترض أنه يتم إعتبار الطالب راسب في حال كان معدله بين 0 و 9.9. و يتم إعتباره ناجح في حال كان معدله 10 و 20.
الخطأ المنطقي الذي وضعناه هو أننا عند طباعة نتيجة الطالب لم نتأكد ما إذا كان المعدل بين 0 كحد أدنى و 20 كحد أقصى.
في المثال التالي قمنا بإنشاء برنامج يطبع للطالب ما إذا كان ناجحاً أو راسباً بناءاً على معدله النهائي.
من المفترض أنه يتم إعتبار الطالب راسب في حال كان معدله بين 0 و 9.9. و يتم إعتباره ناجح في حال كان معدله 10 و 20.
الخطأ المنطقي الذي وضعناه هو أننا عند طباعة نتيجة الطالب لم نتأكد ما إذا كان المعدل بين 0 كحد أدنى و 20 كحد أقصى.
مثال
سنحصل على النتيجة التالية عند تشغيل الملف
.نلاحظ أنه لا يوجد مشكلة برمجية سببت إيقاف الكود لكننا نعلم أن هناك مشكلة منطقية في الكود.
المشكلة المنطقية هنا هي أن المعدل الذي تم على أساسه طباعة جملة النجاح هو معدل مستحيل أن يكون حقيقي.
سنحصل على النتيجة التالية عند تشغيل الملف
.نلاحظ أنه لا يوجد مشكلة برمجية سببت إيقاف الكود لكننا نعلم أن هناك مشكلة منطقية في الكود.
المشكلة المنطقية هنا هي أن المعدل الذي تم على أساسه طباعة جملة النجاح هو معدل مستحيل أن يكون حقيقي.
الجمل
و و ونستخدم هذه الجمل للأسباب التالية:
- أي كود تشك بأنه قد يسبب خطأ يجب وضعه بداخل بلوك الجملة
لضمان أن لا يعلق البرنامج أو يظهر خطأ مفاجئ أثناء التشغيل.- أي كود تريد تنفيذه لمعالجة الخطأ الذي حدث في الجملة .
تضعه بداخل بلوك الجملة - أي كود تريد تنفيذه في حال لم يحدث خطأ في الجملة .
تضعه بداخل بلوك الجملة - أي كود تريد تنفيذه سواء حدث أو لم يحدث خطأ في الجملة .
تضعه بداخل بلوك الجملة
نستخدم هذه الجمل للأسباب التالية:
- أي كود تشك بأنه قد يسبب خطأ يجب وضعه بداخل بلوك الجملة لضمان أن لا يعلق البرنامج أو يظهر خطأ مفاجئ أثناء التشغيل.
- أي كود تريد تنفيذه لمعالجة الخطأ الذي حدث في الجملة . تضعه بداخل بلوك الجملة
- أي كود تريد تنفيذه في حال لم يحدث خطأ في الجملة . تضعه بداخل بلوك الجملة
- أي كود تريد تنفيذه سواء حدث أو لم يحدث خطأ في الجملة . تضعه بداخل بلوك الجملة
معلومة تقنية
بمجرد أن تضع الكود بداخل
ستكون مجبراً على وضع الجملة أو الجملة بعدها أو وضع كلا الجملتين.
كما أن برنامج PyCharm سيظهر لك تنتبيه بمجرد أن تضع الكود بداخل يخبرك فيه أنك يجب أن تضع إحدى هاتين الجملتين بعدها.بعد الجملة
يمكنك وضع الجملة أو الجملة إن أردت لكن لا يمكنك وضع كلاهما في وقت واحد.في حال كنت تكتب كود يمكن أن يسبب عدة أنواع من المشاكل, يمكنك وضع أكثر من جملة
حتى تعالج كل نوع من المشاكل التي قد تحدث على حدا.
إذاً في حال أردت استخدام الجمل
و و سيكون شكل الكود كالتالي.
إذاً في حال أردت استخدام الجمل
و و سيكون شكل الكود كالتالي.
في المثال التالي إستخدمنا الجملتين
و و لم نضع أي خطأ متعمد في الكود.
تذكر: بما أنه لن يحدث أي خطأ بداخل الجملة فهذا يعني أنه لن يتم تنفيذ أي أمر موضوع في الجملة .
بعدها سيتم إكمال تنفيذ أي أوامر موضوعة في البرنامج.
بمجرد أن تضع الكود بداخل
ستكون مجبراً على وضع الجملة أو الجملة بعدها أو وضع كلا الجملتين.كما أن برنامج PyCharm سيظهر لك تنتبيه بمجرد أن تضع الكود بداخل يخبرك فيه أنك يجب أن تضع إحدى هاتين الجملتين بعدها.
بعد الجملة
يمكنك وضع الجملة أو الجملة إن أردت لكن لا يمكنك وضع كلاهما في وقت واحد.في حال كنت تكتب كود يمكن أن يسبب عدة أنواع من المشاكل, يمكنك وضع أكثر من جملة
حتى تعالج كل نوع من المشاكل التي قد تحدث على حدا.إذاً في حال أردت استخدام الجمل
و و سيكون شكل الكود كالتالي.إذاً في حال أردت استخدام الجمل
و و سيكون شكل الكود كالتالي.في المثال التالي إستخدمنا الجملتين
و و لم نضع أي خطأ متعمد في الكود.تذكر: بما أنه لن يحدث أي خطأ بداخل الجملة فهذا يعني أنه لن يتم تنفيذ أي أمر موضوع في الجملة .
بعدها سيتم إكمال تنفيذ أي أوامر موضوعة في البرنامج.
المثال الأول
سنحصل على النتيجة التالية عند تشغيل الملف
.
في المثال التالي إستخدمنا الجملتين
و و وضعنا خطأ متعمد في الكود.
تذكر: بما أنه سيحدث خطأ بداخل الجملة فهذا يعني أنه سيتم الإنتقال إلى الجملة عند حدوث الخطأ.
بعدها, سيتم تنفيذ الأوامر الموضوعة فيها, و من ثم إكمال تنفيذ أي أوامر موضوعة في البرنامج.
سنحصل على النتيجة التالية عند تشغيل الملف
.في المثال التالي إستخدمنا الجملتين
و و وضعنا خطأ متعمد في الكود.تذكر: بما أنه سيحدث خطأ بداخل الجملة فهذا يعني أنه سيتم الإنتقال إلى الجملة عند حدوث الخطأ.
بعدها, سيتم تنفيذ الأوامر الموضوعة فيها, و من ثم إكمال تنفيذ أي أوامر موضوعة في البرنامج.
المثال الثاني
سنحصل على النتيجة التالية عند تشغيل الملف
.
في المثال التالي إستخدمنا الجملتين
و و وضعنا خطأ متعمد في الكود.
ملاحظة: هنا توقعنا حدوث خطأ محدد و إمكانية حدوث أي خطأ آخر.
سنحصل على النتيجة التالية عند تشغيل الملف
.في المثال التالي إستخدمنا الجملتين
و و وضعنا خطأ متعمد في الكود.ملاحظة: هنا توقعنا حدوث خطأ محدد و إمكانية حدوث أي خطأ آخر.
المثال الثالث
سنحصل على النتيجة التالية عند تشغيل الملف
.
في المثال التالي إستخدمنا الجمل الثلاثة
و و و لم نضع أي خطأ متعمد في الكود.
تذكر: الجملة يتم تنفيذ أي أمر موضوع فيها سواء حدث خطأ أو لم يحدث.
سنحصل على النتيجة التالية عند تشغيل الملف
.في المثال التالي إستخدمنا الجمل الثلاثة
و و و لم نضع أي خطأ متعمد في الكود.تذكر: الجملة يتم تنفيذ أي أمر موضوع فيها سواء حدث خطأ أو لم يحدث.
المثال الرابع
سنحصل على النتيجة التالية عند تشغيل الملف
.
في المثال التالي إستخدمنا الجمل الثلاثة
و و و لم نضع أي خطأ متعمد في الكود.
تذكر: الجملة يتم تنفيذ أي أمر موضوع فيها سواء لم يحدث خطأ فقط.
سنحصل على النتيجة التالية عند تشغيل الملف
.في المثال التالي إستخدمنا الجمل الثلاثة
و و و لم نضع أي خطأ متعمد في الكود.تذكر: الجملة يتم تنفيذ أي أمر موضوع فيها سواء لم يحدث خطأ فقط.
المثال الخامس
سنحصل على النتيجة التالية عند تشغيل الملف
.
سنحصل على النتيجة التالية عند تشغيل الملف
.الإستثناءات الجاهزة
تم تقسيم الإستثناءات أو الأخطاء الأساسية في بايثون إلى عدة أنواع و كل نوع تم تمثيله في كلاس خاص.
جميع هذه الكلاسات ترث من كلاس أساسي إسمه
.
و هذا يعني أنك إذا أردت تعريف إستثناء خاص فيك في المستقبل سيكون عليك إنشاء كلاس يرث من هذا الكلاس أو من إحدى الكلاسات التي ترث منه.إذاً, أي كلاس يرث من الكلاس
هو كلاس يمثل إستثناء معين.
تم تقسيم الإستثناءات أو الأخطاء الأساسية في بايثون إلى عدة أنواع و كل نوع تم تمثيله في كلاس خاص.
جميع هذه الكلاسات ترث من كلاس أساسي إسمه
و هذا يعني أنك إذا أردت تعريف إستثناء خاص فيك في المستقبل سيكون عليك إنشاء كلاس يرث من هذا الكلاس أو من إحدى الكلاسات التي ترث منه.
إذاً, أي كلاس يرث من الكلاس
هو كلاس يمثل إستثناء معين.طباعة رسالة الخطأ الذي حدث
عندما يحدث خطأ في الجملة
, يقوم مفسر بايثون ينشئ كائن يمثل نوع الخطأ الذي حدث في هذه الجملة.
بعدها يمر على كل جملة موضوعة بعدها, و يقارن نوع الكائن الذي تم إنشاؤه في الجملة مع نوع الخطأ ( الذي هو في الأصل عبارة عن إسم الكلاس الذي يمثل الخطأ المتوقع حصوله ) الذي تعامله كل جملة حتى يجد الجملة التي تعالج هذا النوع من الأخطاء و ينفذ الأوامر الموضوعة فيها.الآن, في حال أردت طباعة رسالة الخطأ الذي حدث في الجملة
و التي بدورها أرسلته إلى الجملة فكل ما عليك فعله هو إستقبال رسالة الخطأ من هذا الكائن و وضعها في متغير بواسطة الكلمة المفتاحية .
المثال التالي يعلمك طريقة طباعة رسالة الخطأ الجاهزة في الكائن الذي يمثل الخطأ المحدد الذي قد يحدث.
عندما يحدث خطأ في الجملة
, يقوم مفسر بايثون ينشئ كائن يمثل نوع الخطأ الذي حدث في هذه الجملة.بعدها يمر على كل جملة موضوعة بعدها, و يقارن نوع الكائن الذي تم إنشاؤه في الجملة مع نوع الخطأ ( الذي هو في الأصل عبارة عن إسم الكلاس الذي يمثل الخطأ المتوقع حصوله ) الذي تعامله كل جملة حتى يجد الجملة التي تعالج هذا النوع من الأخطاء و ينفذ الأوامر الموضوعة فيها.
الآن, في حال أردت طباعة رسالة الخطأ الذي حدث في الجملة
و التي بدورها أرسلته إلى الجملة فكل ما عليك فعله هو إستقبال رسالة الخطأ من هذا الكائن و وضعها في متغير بواسطة الكلمة المفتاحية .المثال التالي يعلمك طريقة طباعة رسالة الخطأ الجاهزة في الكائن الذي يمثل الخطأ المحدد الذي قد يحدث.
المثال الأول
سنحصل على النتيجة التالية عند تشغيل الملف
.
المثال التالي يعلمك طريقة طباعة رسالة الخطأ الجاهزة مهما كان نوع الخطأ الذي حدث في الجملة
.
ملاحظة: قمنا بإعادة نفس المثال السابق مع تبديل الكلاس بالكلاس .
الفكرة لأساسية هنا هي أنه بما أن الكلاس يعتبر الكلاس الأساسي لأي خطأ قد يحدث, فهذا يعني أنه يمكننا إعتبار الخطأ الذي حدث عبارة عن كائن منه لأنه سيكون من كلاس يرث منه.
سنحصل على النتيجة التالية عند تشغيل الملف
.المثال التالي يعلمك طريقة طباعة رسالة الخطأ الجاهزة مهما كان نوع الخطأ الذي حدث في الجملة
.ملاحظة: قمنا بإعادة نفس المثال السابق مع تبديل الكلاس بالكلاس .
الفكرة لأساسية هنا هي أنه بما أن الكلاس يعتبر الكلاس الأساسي لأي خطأ قد يحدث, فهذا يعني أنه يمكننا إعتبار الخطأ الذي حدث عبارة عن كائن منه لأنه سيكون من كلاس يرث منه.
المثال الثاني
سنحصل على النتيجة التالية عند تشغيل الملف
.
سنحصل على النتيجة التالية عند تشغيل الملف
.الكلمة المفتاحية
في حال أردت بناء دالة ترمي إستثناء في حال حدوث خطأ معين, كل ما عليك فعله هو جعل هذه الدالة تفعل
لكائن من الكلاس يحتوي على رسالة الخطأ التي تريد إظهارها.
في المثال التالي قمنا ببناء دالة ترمي إستثناء في حال تم تمرير قيمة أصغر من 0 لها عند استدعائها.
بعدها قمنا باستدعاء الدالة و تمرير قيمة أصغر من 0 لها فتسبب ذلك بإيقاف البرنامج.
في حال أردت بناء دالة ترمي إستثناء في حال حدوث خطأ معين, كل ما عليك فعله هو جعل هذه الدالة تفعل
لكائن من الكلاس يحتوي على رسالة الخطأ التي تريد إظهارها.في المثال التالي قمنا ببناء دالة ترمي إستثناء في حال تم تمرير قيمة أصغر من 0 لها عند استدعائها.
بعدها قمنا باستدعاء الدالة و تمرير قيمة أصغر من 0 لها فتسبب ذلك بإيقاف البرنامج.
المثال الأول
سنحصل على النتيجة التالية عند تشغيل الملف
.
في المثال التالي قمنا ببناء دالة ترمي إستثناء في حال تم تمرير قيمة أصغر من 0 لها عند استدعائها.
بعدها قمنا باستدعاء الدالة بداخل بلوك
مع تمرير قيمة أصغر من 0 لها و من ثم معالجة الخطأ الذي ستسببه بداخل بلوك .
سنحصل على النتيجة التالية عند تشغيل الملف
.في المثال التالي قمنا ببناء دالة ترمي إستثناء في حال تم تمرير قيمة أصغر من 0 لها عند استدعائها.
بعدها قمنا باستدعاء الدالة بداخل بلوك
المثال الثاني
سنحصل على النتيجة التالية عند تشغيل الملف
.
سنحصل على النتيجة التالية عند تشغيل الملف
.
تعليقات
إرسال تعليق