طَبِّقْهاتعلّم المبدأ، وطبّقه بيدكمقرر 111 · أساسيات برمجة الحاسب
الدرس 27 · الوحدة 6: الأخطاء والمشروع الختامي

الاستثناءات: try و except

نجعل البرنامج يتعامل مع الأخطاء بهدوء بدل أن ينهار. ⏱ نحو 20 دقيقة.

tryexcept
بعد هذا الدرس ستستطيع أن:
  • تشرح معنى الاستثناء.
  • تمنع انهيار البرنامج بـ try و except.
  • تتعامل مع أكثر من نوع خطأ.
  • تكرر طلب الإدخال حتى يكون صحيحًا.

١عندما يُدخل المستخدم شيئًا غير متوقع

طلبنا عددًا، فكتب المستخدم «عشرون» بالحروف. ماذا يحدث؟

main.py
age = int(input("عمرك: "))print("بعد سنة سيكون عمرك", age + 1)
Shell×
>>> %Run main.py
عمرك: عشرون
Traceback (most recent call last):
File "main.py", line 1, in <module>
age = int(input("عمرك: "))
ValueError: invalid literal for int() with base 10: 'عشرون'
>>>

توقّف البرنامج كله بسبب ValueError. هذا الخطأ أثناء التشغيل يسمى استثناءً. والمستخدم الحقيقي يخطئ كثيرًا، فلا نريد أن ينهار البرنامج.

٢try و except: شبكة الأمان

نضع الكود الذي قد يفشل داخل try (جرّب)، ونكتب في except (عند الخطأ) ما نفعله إذا فشل:

main.py
try:    age = int(input("عمرك: "))    print("بعد سنة سيكون عمرك", age + 1)except ValueError:    print("من فضلك اكتب العمر بالأرقام")print("انتهى البرنامج بسلام")
Shell×
>>> %Run main.py
عمرك: عشرون
من فضلك اكتب العمر بالأرقام
انتهى البرنامج بسلام
>>>

إذا نجح ما في try تُتجاهل except. وإذا فشل، ينتقل التنفيذ فورًا إلى except، ثم يكمل البرنامج بعدها.

٣أكثر من نوع خطأ

نكتب except لكل نوع خطأ نتوقعه، فيكون لكل خطأ رسالته:

main.py
try:    total = int(input("المبلغ: "))    people = int(input("عدد الأشخاص: "))    print("نصيب كل شخص:", total / people)except ValueError:    print("اكتب أرقامًا فقط")except ZeroDivisionError:    print("عدد الأشخاص لا يكون صفرًا")
Shell×
>>> %Run main.py
المبلغ: 300
عدد الأشخاص: 0
عدد الأشخاص لا يكون صفرًا
>>>

٤اطلب حتى يكتب قيمة صحيحة

نجمع ما تعلّمناه: حلقة while True مع try، ونخرج بـ break عند النجاح:

main.py
while True:    try:        mark = int(input("الدرجة: "))        break    except ValueError:        print("غير صحيح، حاول مرة أخرى")print("تم حفظ الدرجة:", mark)
Shell×
>>> %Run main.py
الدرجة: ثمانون
غير صحيح، حاول مرة أخرى
الدرجة: 8o
غير صحيح، حاول مرة أخرى
الدرجة: 80
تم حفظ الدرجة: 80
>>>

هذا النمط تحتاجه في كل برنامج يقرأ أعدادًا من المستخدم، وستستخدمه في المشروع الختامي.

📎 للاستزادة (اختياري): finally

الجزء finally يُنفَّذ دائمًا، نجح الكود أم فشل. يفيد مثلًا في إغلاق ملف:

main.py
try:    x = 10 / 0except ZeroDivisionError:    print("قسمة على صفر")finally:    print("هذا السطر يُنفَّذ دائمًا")
Shell×
>>> %Run main.py
قسمة على صفر
هذا السطر يُنفَّذ دائمًا
>>>

توقّع وتحقّق

ماذا نضع داخل try؟

try تعني «جرّب».

متى تُنفَّذ أسطر except؟

فقط إذا فشل ما في try.

أي خطأ يظهر عند int("abc")؟

القيمة لا تصلح للتحويل.

ما الذي يجعل البرنامج يكرر الطلب حتى تكون القيمة صحيحة؟

نكرر، ونخرج عند النجاح.

الخلاصة

تحدٍّ برمجي: قسمة آمنة

متوسط

اكتب برنامجًا يقرأ عددين ويطبع ناتج قسمة الأول على الثاني. إذا كتب المستخدم غير الأرقام اطبع: أرقام فقط، وإذا كان الثاني صفرًا اطبع: لا قسمة على صفر.

المطلوب:
  • ضع القراءة والقسمة داخل try.
  • except ValueError للأرقام.
  • except ZeroDivisionError للصفر.
  • اطبع: الناتج: ثم القيمة.

ابدأ من هذا الكود، واضغط ▶ شغّل هنا لتكتب حلّك وتجرّبه مباشرة:

main.py
try:    a = int(input("الأول: "))
المطلوب×
الأول: 20
الثاني: 0
لا قسمة على صفر
💡 تلميح 1
b = int(input("الثاني: "))
💡 تلميح 2
except ZeroDivisionError:

حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.

main.py
try:    a = int(input("الأول: "))    b = int(input("الثاني: "))    print("الناتج:", a / b)except ValueError:    print("أرقام فقط")except ZeroDivisionError:    print("لا قسمة على صفر")
انتقل إلى تقييم الدرساختيار من متعدد، وصح وخطأ، وأكمل الفراغ، وتتبّع الناتج.ابدأ التقييم ←