الاستثناءات: try و except
نجعل البرنامج يتعامل مع الأخطاء بهدوء بدل أن ينهار. ⏱ نحو 20 دقيقة.
- تشرح معنى الاستثناء.
- تمنع انهيار البرنامج بـ
tryوexcept. - تتعامل مع أكثر من نوع خطأ.
- تكرر طلب الإدخال حتى يكون صحيحًا.
١عندما يُدخل المستخدم شيئًا غير متوقع
طلبنا عددًا، فكتب المستخدم «عشرون» بالحروف. ماذا يحدث؟
age = int(input("عمرك: "))print("بعد سنة سيكون عمرك", age + 1)
توقّف البرنامج كله بسبب ValueError. هذا الخطأ أثناء التشغيل يسمى استثناءً. والمستخدم الحقيقي يخطئ كثيرًا، فلا نريد أن ينهار البرنامج.
٢try و except: شبكة الأمان
نضع الكود الذي قد يفشل داخل try (جرّب)، ونكتب في except (عند الخطأ) ما نفعله إذا فشل:
try: age = int(input("عمرك: ")) print("بعد سنة سيكون عمرك", age + 1)except ValueError: print("من فضلك اكتب العمر بالأرقام")print("انتهى البرنامج بسلام")
إذا نجح ما في try تُتجاهل except. وإذا فشل، ينتقل التنفيذ فورًا إلى except، ثم يكمل البرنامج بعدها.
٣أكثر من نوع خطأ
نكتب except لكل نوع خطأ نتوقعه، فيكون لكل خطأ رسالته:
try: total = int(input("المبلغ: ")) people = int(input("عدد الأشخاص: ")) print("نصيب كل شخص:", total / people)except ValueError: print("اكتب أرقامًا فقط")except ZeroDivisionError: print("عدد الأشخاص لا يكون صفرًا")
٤اطلب حتى يكتب قيمة صحيحة
نجمع ما تعلّمناه: حلقة while True مع try، ونخرج بـ break عند النجاح:
while True: try: mark = int(input("الدرجة: ")) break except ValueError: print("غير صحيح، حاول مرة أخرى")print("تم حفظ الدرجة:", mark)
هذا النمط تحتاجه في كل برنامج يقرأ أعدادًا من المستخدم، وستستخدمه في المشروع الختامي.
📎 للاستزادة (اختياري): finally
الجزء finally يُنفَّذ دائمًا، نجح الكود أم فشل. يفيد مثلًا في إغلاق ملف:
try: x = 10 / 0except ZeroDivisionError: print("قسمة على صفر")finally: print("هذا السطر يُنفَّذ دائمًا")
توقّع وتحقّق
ماذا نضع داخل try؟
try تعني «جرّب».متى تُنفَّذ أسطر except؟
try.أي خطأ يظهر عند int("abc")؟
ما الذي يجعل البرنامج يكرر الطلب حتى تكون القيمة صحيحة؟
الخلاصة
- الاستثناء خطأ يحدث أثناء التشغيل، مثل
ValueErrorوZeroDivisionError. try: الكود الذي قد يفشل، وexcept: ما نفعله عند الفشل.- نكتب
exceptلكل نوع خطأ نتوقعه. while Trueمعtryوbreakتكرر الطلب حتى تصح القيمة.
تحدٍّ برمجي: قسمة آمنة
متوسطاكتب برنامجًا يقرأ عددين ويطبع ناتج قسمة الأول على الثاني. إذا كتب المستخدم غير الأرقام اطبع: أرقام فقط، وإذا كان الثاني صفرًا اطبع: لا قسمة على صفر.
- ضع القراءة والقسمة داخل try.
- except ValueError للأرقام.
- except ZeroDivisionError للصفر.
- اطبع: الناتج: ثم القيمة.
ابدأ من هذا الكود، واضغط ▶ شغّل هنا لتكتب حلّك وتجرّبه مباشرة:
try: a = int(input("الأول: "))
💡 تلميح 1
b = int(input("الثاني: "))💡 تلميح 2
حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.
try: a = int(input("الأول: ")) b = int(input("الثاني: ")) print("الناتج:", a / b)except ValueError: print("أرقام فقط")except ZeroDivisionError: print("لا قسمة على صفر")