استعمال try-exept
كما قلنا سابقا تفيدنا هذه العبارة أو الطريقة في تسير الأخطاء و تجنب فشل
تنفيد البرنامج عند حدوث خطئ و تفيدنا أيضا في ابلاغ المستخدم بنوع الخطئ
و اسباب حدوثه
و كما نلاحظ أن هذه العبارة تنقسم إلى قسمين
كود PHP:
try :
هنا نضع الكود أو الأوامر التي ستنفد في الحالة العادية أي إذا لم يحدث خطئ
كود PHP:
execpt : Exception[, reason]:
هنا نضع الأوامر التي ستنفد عند حدوث خلل في التنفيد و نستطيع كذلك وضع رسالة لتنبيه المستخدم بالخطئ و سبب حدوثه
مثال
كود PHP:
name={'user1':'ab256','user2':'9857oki','user3':'8fgd5ft'}
search=raw_input('enter the name :')
name.pop(search)
هذا الكود يقوم بحذف إسم من القاموس جربوا هذا الكود عندكم و ادخلو اسم لا يوجد في القاموس
ماالذي سيحدث؟؟
سيتوقف البرنامج تماما و يطبع لنا المفسر رسالة خطئ .
طيب نحن الآن قمنا بكتابة هذا الكود و سنقوم بتصحيح الخطئ لكن لو كان هذا الكود جزء من كود كبير لمشروع و حدث هذا الخطئ .
ستكون النتائج وخيمة جدا لأن البرنامج سيتوقف عن العمل و سيتوقف النظام أو يبطئ لدقائق .
إذا سنستغل الطريقة التي رأيناها بحيث إذا حدث خطئ لن يتوقف البرنامج بل يطبع لنا رسالة تنبؤنا بسبب الخطئ
كود PHP:
name={'user1':'ab256','user2':'9857oki','user3':'8fgd5ft'}
search=raw_input('enter the name :')
try:
name.pop(search)
except Exception,e:
print e
نفس البرنامج ولكننا أدخلنا عليه عبارة try-except
داخل عبارة try قمنا بوضع الأوامر التي ستنفد في حالة وجود الإسم داخل القاموس .
داخل عبارة except أضفنا أمامها كلمة Exception و التي تعني سبب الخطئ ثم
فاصلة و تليها e و هذا الأخير سيحجز داخله عبارة تبين سبب الخطئ أي نستطيع
أن نعتبره متغير يحجز داخله الرسالة التي سيرسلها النظام في حالة وجود خطئ
طبعا نستطيع استبدال e بأي حرف آخر و لكن المتعارف عليه في كل لغاة البرمجة استعمال حرف e
e هذا سيحجز لنا سبب الخطئ و نستطيع التصرف في الرسالة كما نريد
مثلا
كود PHP:
except Exception,e:
print "Error Invalid entry !",e
و مايهمنا أن البرنامج سيواصل العمل مهما أدخل المستخدم
مثال ثاني
سيبين لنا هذا المثال فائدة عبارة try-except أكثر
لدينا دالة محجوزة للغة البايثون اسمها float() تقوم بتحويل الأعداد من صيغتها الأصلية إلى صيغة float
مثلا جربوا لديكم
كود PHP:
print float(54158)
طيب لو أدخلنا بدل الأعداد أحرف سيحدث خطئ وهذا طبيعي
كود PHP:
print float('qsdzs)
و ستكون رسالة الخطئ كالتالي
كود PHP:
Message File Name Line Position
Traceback
<module> <Module1> 1
exceptions.NameError: name 'qsdzs' is not defined
طيب انا قلت أن حدوث الخطئ في هذه الحالة طبيعي جدا لأن هذه الدالة
مخصصة للأعداد و ليس للأحرف لكن الذي ليس طبيعي لنا هو توقف البرنامج عن
العمل و دائما أقول ضعوا في حسبانكم المشاريع الكبيرة خطئ بسيط كهذا سيسبب
لنا كارثة
طيب سنتعامل مع إمكانية حدوث هذا الخطئ بواسطة try-except
سنعمل دالة اسمها float1 تقوم بنفس عمل الأولى لكنها أأمن من الأولى
كود PHP:
def float1(obj):
try:
retval = float(obj)
except :
message = "could not convert non-number to float"
return message
print float1('uu')
نستطيع أيضا أن نحدد أو نتوقع نوع الخطئ الممكن الوقوع لكي نساعد المفسر على طباعة الرسالة المناسبة
في حالتنا هذه نوع الخطئ متعلق بالمتغير و تسمى هذه الأخطاء بـ ValueError
و نقوم بتعديل القسم الثاني من الكود فيصح كالتالي
كود PHP:
except ValueError :
message = "could not convert non-number to float"
return message
استعمال أكثر من except
إذا كان لدينا توقع بحدوث أكثر من خطئ في قسم معين من الكود نستطيع أن نعالج هذا الوضع بإدراج أكثر من عبارة except على النحو التالي
كود PHP:
except Exception1[, reason1]:
suite_for_exception_Exception1
except Exception2[, reason2]:
suite_for_exception_Exception2
:
فيصبح الكود كالتالي
كود PHP:
def float1(obj):
try:
retval = float(obj)
except ValueError:
retval = 'could not convert non-number to float'
except TypeError:
retval = 'object type cannot be converted to float'
return retval
print float1('a')
كما أننا نستطيع ان نجمع عدة احتمالات في عبارة واحدة على النحو التالي
كود PHP:
except (Exception1, Exception2)[, reason]:
suite_for_Exception1_and_Exception2
فيصبح الكود على النوح التالي
كود PHP:
def float1(obj):
try:
retval = float(obj)
except (ValueError, TypeError):
retval = 'argument must be a number or numeric string'
return retval
print float1(())
print float1('rr')
print float1([])
طيب الآن لو أردنا أن نكتفي من عناء كتابة رسائل الأخطاء أو إن
أردنا أن تكون رسائل الأخطاء ذات صيغة احترافية أي تكون كالتي يطبعها لنا
المفسر عند حدوث خطئ هنا يتوجب علينا استعمال الطريقة التالية
-نبقى مع نفس المثال-
كود PHP:
def float1(object):
try:
message = float(object)
except (ValueError, TypeError), diag:
message= str(diag)
return message
print float1(22)
print float1('rr')
كما نلاحظ بقي المثال على حاله و لكننا اضفنا عليه العبارة التالية
كود PHP:
message= str(diag)
هنا طلبنا من المفسر أن يحول لنا الخطئ إلى صيغة string(str) حتى نتمكن من طباعته للمستخدم
طبعا ليست هذه الطريقة مفيدة دائما لأنه لو كان لدينا برنامج يتعامل مع
مستخدمين عاديين يتوجب علينا عمل رسائل سهلة و مفهومة لهم و لو كان
برنامجنا يتعامل مع مستخدمين محترفين هنا ستكون هذه الطريقة هي المثلى
نتوقف عند هذا الحد سنواصل ما تبقى من هذا الدرس في الدرس المقبل بإذن الله
تم بحمد الله