التعامل مع الأخطاء
سنقوم الأن بتعلم كيف يمكننا معالجة الأخطاء في شفرة البرنامج. حتى أفضل البرامج أحيانا ما ينتج عنها أخطاء. بعض هذه الأخطاء هي عبارة عن عيوب في شفرة البرنامج يمكن إكتشافها و تحديدها. بعضها الآخر غير ناتج عن البرنامج مثلا و لكن عن بيئة التشغيل، كأن يحاول البرنامج فتح ملف مفتوح في برنامج أخر. في مثل هذه الحالات يمكن التنبؤ بمثل هذه الأخطاء ولكن لايمكن منعها. وكمبرمج فمن ضمن واجباتك التنبأ بمثل هذه الأخطاء وتكييف برنامجك للتعامل معها.
الأخطاء الإملائية
و هي الأخطاء الكتابية في الشفرة كنسيان حرف أو كتابة عبارة مجهولة لا تحتويها اللغة مثلا عوض أن نكتب else كتبنا elqe أو نسيان النقطتين ':' بعد عبارة if ... إلخ
وهذا النوع من الأخطاء الأسهل في الإكتشاف لأنك بمجرد أن تنفذ البرنامج سيحدد لك المفسر مكان الخطأ فتقوم بتصليحه.
الأخطاء من نوع Run Time
يطلق على الخطأ الذي يحدث أثناء تشغيل البرنامج Run Time Error. هذا النوع من الأخطاء يحدث عندما يحاول البرنامج أن يقوم بعمل لم يصمم البرنامج من أجله. مثلا أن يقوم البرنامج بعملية غير مقبولة Illegal Operation كأن يقوم بعملية جمع بين متغير رقمي و متغير نصي، و مثل هذه الحالات تحدث أخطاء Run Time.
إذا لم توجد شفرة معينة داخل البرنامج لمعالجة الخطأ سوف يتوقف و عندئذ ستحتاج لإعادة تشغيلة مرة أخرى. و في مثل هذه الحالات غالبا ما يحدث فقد في البيانات التي يديرها البرنامج لذلك يفضل البحث عن هذه الأخطاء أيًّا كان موضعها و إزالتها.
مثال لخطأ شهير
هذا السكربت يحاول طبع حاصل قسمة العدد 1 على 0 :
#!/usr/bin/python print 1 / 0
هذا هو رد بايثون عند تنفيذ السكربت :
Traceback (most recent call last):
File "C:\Documents and Settings\MOHAMED\Bureau\aa.py", line 2, in <module>
print 1 / 0
ZeroDivisionError: integer division or modulo by zeroفي الرياضيات لا يمكنك قسمة عدد على صفر لهذا توقف البرنامج لحدوث خطأ.
لاحظ السطر التالي :
ZeroDivisionError: integer division or modulo by zero
ZeroDivisionError : هو إسم الخطأ.
integer division or modulo by zero : رسالة الخطأ.
العبارة try - except
يمكنك إستخدام العبارة try -except لمعالجة الأخطاء في شفرتك. منطق هذه العبارة بسيط للغاية، فيمكنك أن تجرب try جزء من الشفرة، فإذا حدث أي إستثناء في الشفرة، ينتقل البرنامج إلى السطور التالية ل except و يقوم بتنفيذ هذه السطور.
معالجة الخطأ : ZeroDivisionError
#!/usr/bin/python
try :
print 1 / 0
except ZeroDivisionError, e :
print e- في السطر الثاني كتبنا العبارة try وبعدها وضعنا النقطتين ':'.
- في Block الخاص ب try وظعنا الكود print 1 / 0 .
- في السطر الرابع كتبنا العبارة except يليها إسم الخطأ (ZeroDivisionError) يليه الفاصلة ',' يليها المتغير e والذي تحفظ فيه رسالة الخطأ يليه النقطتين ':' .
- في Block الخاص ب except وضعنا الكود print e لطباعة رسالة الخطأ.
عند تنفيذ السكربت لا يتوقف البرنامج بل يطبع لنا رسالة الخطأ :
>>> ================================ RESTART ================================ >>> integer division or modulo by zero >>>
الأن نستطيع تحديد الصورة العامة للعبارة try - except :
try : #-----بداية البلوك-----# هنا نضع الأوامر التي ستنفذ في الحالة العادية أي إذا لم يحدث الخطأ #-----نهاية البلوك-----# except : #-----بداية البلوك-----# هنا نضع الأوامر التي ستنفذ عند حدوث خلل في التنفيذ #-----نهاية البلوك-----#
في بعض الأحيان قد لا تعرف إسم الخطأ لذا ما عليك إلا وضع العبارة Exception بدل إسم الخطأ و المفسر سيحدد الرسالة المناسبة. كالتالي :
#!/usr/bin/python
try :
print 1 / 0
except Exception, e :
print eفي التعديل التالي طبعنا النص ": Error" قبل طباعة رسالة الخطأ.
#!/usr/bin/python
try :
print 1 / 0
except Exception, e :
print "Error :", eالناتج سيكون كالتالي :
>>> ================================ RESTART ================================ >>> Error : integer division or modulo by zero >>>
رسائل الخطأ في بايثون كلها باللغة الإنجليزية فإذا كنت تبرمج برنامج عربي فعليك توقع نوع أو إسم الخطأ و كتابة رسالة تناسبه، كالتالي :
#!/usr/bin/python
# -*- coding: cp1256 -*-
try :
print 1 / 0
except :
print "لا يمكنك القسمة على 0"هذا هو الناتج عند تنفيذ السكربت :
>>> ================================ RESTART ================================ >>> لا يمكنك القسمة على 0 >>>
اليوم تعاملنا مع خطأ واحد هو ZeroDivisionError، في الدرس القادم سأعرفكم على بعض الأخطاء الأخرى، ثم أريكم كيفية إستخدام العبارة else مع العبارة try - except، كما ستتعرفون على العبارة try - except - finally، كما سأستعمل بعض السكربتات البسيطة لتسهيل الفهم.
فهرس الدورة
الفصل الاول : أساسيات بايثون
دورة بايثون من الصفر الى الاحتراف
الدرس الاول : أمر الطباعة print + التعليقات
الدرس الثاني : المتغيرات Variables
الدرس الرابع : الجملة الشرطية if
الدرس السادس : الكائنات متعددة العناصر (الجزء الأول)
الدرس السابع : الكائنات متعددة العناصر (الجزء الثاني)
الدرس الثامن : الحلقات loops (الجزء الأول)
الدرس التاسع : الحلقات loops (الجزء الثاني)
الفصل الثاني : Functions & Procedures
الدرس العاشر : الدوال Function
الدرس الحادي عشر : دوال بايثون الجاهزة
الفصل الثالث : البرمجة الكائنية المنحى oop
الدرس الثاني عشر : رابط لتعلم البرمجة الكائنية المنحى
الفصل الرابع : الأخطاء و الإستثناءات Errors, Exceptions
