الدرس 25 من دورة Python للمبتدئين

try و except: امنع البرنامج من الانهيار عند إدخال خاطئ

في الدروس السابقة كان البرنامج ينهار إذا كتب المستخدم سعرًا غير رقمي. الآن سنتعلم كيف نتعامل مع هذا الخطأ برسالة واضحة، ثم نعيد السؤال بدل أن يتوقف البرنامج.

المستوى: مبتدئ جدًا النتيجة: برنامج يتحمل إدخالًا خاطئًا مدة التطبيق: 35 - 40 دقيقة
طريقة CIT للتعلم الهادئ: لا نريدك أن تحفظ try و except فقط. افهمها كحارس ذكي: جرّب هذا الأمر، وإذا فشل، لا تنهار؛ تعامل مع المشكلة بهدوء.
مهم قبل البداية: الخطأ ليس عيبًا في البرنامج دائمًا. أحيانًا المستخدم يكتب شيئًا غير متوقع، والبرنامج المحترف يجب أن يعرف كيف يتصرف.

ما النتيجة التي يجب أن تخرج بها؟

في نهاية الدرس ستفهم هذا الشكل:

try:
    price = float(price_text)
except ValueError:
    print("السعر غير صحيح، اكتب رقمًا فقط")
    continue

معنى هذا الكود: جرّب تحويل النص إلى رقم. إذا فشل التحويل، اعرض رسالة واضحة وارجع لبداية الحلقة.

try نضع داخله الكود الذي قد يسبب خطأ.
except نضع داخله التصرف عند حدوث الخطأ.
ValueError خطأ يحدث عند فشل تحويل النص إلى رقم.
خريطة درس try و except في Python
تدفق try و except عند تحويل السعر
1

ما المشكلة التي نحلها؟

عند كتابة:

price = float(price_text)

يتوقع Python أن يكون النص قابلًا للتحويل إلى رقم، مثل:

50
99.5
120

لكن إذا كتب المستخدم:

abc
خمسين
50 ريال

فلن يستطيع Python تحويل النص إلى رقم، وسيظهر خطأ اسمه:

ValueError
الفكرة ببساطة: نحن لا نمنع المستخدم من الخطأ، لكننا نمنع البرنامج من الانهيار عند الخطأ.
تحقق قبل الانتقال ✅ هل فهمت أن المشكلة تحدث عند محاولة تحويل نص غير رقمي إلى float؟
2

أنشئ ملف الدرس الخامس والعشرين

افتح مجلد الدورة داخل VS Code:

python_course

ثم أنشئ ملفًا جديدًا باسم:

lesson_25.py

افتح الملف داخل Editor.

توقف لحظة ✅ هل ظهر ملف lesson_25.py داخل Explorer؟ إذا نعم، انتقل للخطوة التالية.
3

جرّب الخطأ بدون try

اكتب هذا المثال:

price_text = input("اكتب السعر: ")

price = float(price_text)

print(price)

شغل البرنامج، ثم اكتب:

abc

ستلاحظ أن البرنامج يتوقف ويظهر خطأ. هذا ما نريد إصلاحه.

لا تقلق: ظهور الخطأ هنا مقصود. نحن نريد أن يرى المتعلم المشكلة قبل أن يتعلم الحل.
سؤال سريع 🧠 لماذا ظهر الخطأ؟ لأن abc لا يمكن تحويلها إلى رقم باستخدام float.
4

استخدم try و except

الآن عدّل المثال:

price_text = input("اكتب السعر: ")

try:
    price = float(price_text)
    print(price)
except ValueError:
    print("السعر غير صحيح، اكتب رقمًا فقط")
خريطة try و except في Python
ماذا حدث؟ Python جرّب التحويل داخل try. إذا نجح، طبع السعر. وإذا فشل، انتقل إلى except بدل أن ينهار البرنامج.
تحقق قبل الانتقال ✅ هل فهمت أن except لا تعمل إلا إذا حدث الخطأ المحدد؟
5

أدخل try و except داخل مشروع المشتريات

في مشروعنا، السطر الذي قد يسبب خطأ هو:

price = float(price_text)

لذلك سنضعه داخل try:

try:
    price = float(price_text)
except ValueError:
    print("السعر غير صحيح، اكتب رقمًا فقط")
    continue
شرح continue داخل while في Python
ما وظيفة continue؟ تعني: لا تكمل بقية الكود في هذه الدورة، وارجع لبداية while واسأل من جديد.
سؤال سريع 🧠 إذا كتب المستخدم سعرًا خاطئًا، هل نضيف المنتج إلى القائمة؟ لا، نرجع للسؤال أولًا.
6

رتّب الكود النهائي على أجزاء

الجزء الأول: دوال الحساب:

def calculate_tax(total):
    return total * 0.15

def calculate_final_total(total, tax):
    return total + tax

الجزء الثاني: دالة التقرير:

def print_report(products, total, tax, final_total):
    print("----- تقرير المنتجات -----")

    for product in products:
        name = product["name"]
        price = product["price"]

        print(f"{name}: {price:.2f} ريال")

    print(f"عدد المنتجات: {len(products)}")
    print(f"الإجمالي قبل الضريبة: {total:.2f} ريال")
    print(f"الضريبة: {tax:.2f} ريال")
    print(f"الإجمالي النهائي: {final_total:.2f} ريال")

الجزء الثالث: المتغيرات الأساسية:

products = []
total = 0

name_prompt = "اسم المنتج أو done: "
price_prompt = "سعر المنتج: "

الجزء الرابع: استقبال المنتجات مع حماية السعر:

أولًا: ابدأ الحلقة واقرأ اسم المنتج:

while True:
    product_name = input(name_prompt).strip()

    if product_name.lower() == "done":
        break

ثانيًا: اقرأ السعر وحاول تحويله إلى رقم:

    price_text = input(price_prompt).strip()

    try:
        price = float(price_text)
    except ValueError:
        print("السعر غير صحيح، اكتب رقمًا فقط")
        continue

ثالثًا: إذا كان السعر صحيحًا، أنشئ المنتج وأضفه إلى القائمة:

    product = {
        "name": product_name,
        "price": price
    }

    products.append(product)
    total = total + price

الجزء الخامس: حساب النتائج واستدعاء التقرير:

tax = calculate_tax(total)
final_total = calculate_final_total(total, tax)

print_report(products, total, tax, final_total)
برنامج مشتريات لا ينهار عند السعر الخاطئ
مهم: الأجزاء الخمسة السابقة تُكتب في نفس ملف lesson_25.py بالترتيب.
تحقق قبل الانتقال ✅ هل فهمت أن try و except موجودة داخل while لأنها تتعامل مع كل سعر يدخله المستخدم؟
7

شغّل البرنامج

احفظ الملف:

Ctrl + S

ثم شغله:

python lesson_25.py

وإذا لم يعمل أمر python:

py lesson_25.py
تحقق قبل الانتقال ✅ هل اشتغل البرنامج وبدأ يطلب اسم المنتج؟
8

اختبر البرنامج بإدخال خاطئ

جرّب هذه الإدخالات:

اسم المنتج أو done: Keyboard
سعر المنتج: abc
السعر غير صحيح، اكتب رقمًا فقط

اسم المنتج أو done: Keyboard
سعر المنتج: 100

اسم المنتج أو done: Mouse
سعر المنتج: 50

اسم المنتج أو done: done

النتيجة المتوقعة:

----- تقرير المنتجات -----
Keyboard: 100.00 ريال
Mouse: 50.00 ريال
عدد المنتجات: 2
الإجمالي قبل الضريبة: 150.00 ريال
الضريبة: 22.50 ريال
الإجمالي النهائي: 172.50 ريال
ماذا تعلمت؟ البرنامج لم ينهار عند abc. عرض رسالة واضحة، ثم سمح للمستخدم أن يحاول مرة أخرى.
توقف لحظة ✅ هل اختبرت إدخالًا خاطئًا ثم إدخالًا صحيحًا؟ لا تعتمد الدرس قبل تجربة الحالتين.
9

تحدي صغير: امنع السعر السالب

بعد تحويل السعر إلى float، أضف هذا الفحص:

if price < 0:
    print("السعر لا يمكن أن يكون سالبًا")
    continue
هدف التحدي: try و except تحمي من النص غير الرقمي، لكن السعر السالب رقم صحيح من ناحية التحويل. لذلك نحتاج شرطًا إضافيًا لمنعه.
تحدي التفكير 🧠 لماذا لا يلتقط except السعر السالب؟ لأن float يستطيع تحويل -50 إلى رقم، لذلك لا يحدث ValueError.

اختبار نهاية الدرس

قبل الانتقال للدرس القادم، تأكد أنك فهمت هذه النقاط:

✅ فهمت لماذا ينهار البرنامج عند سعر غير رقمي.
✅ عرفت أن ValueError يحدث عند فشل التحويل إلى رقم.
✅ استخدمت try لتجربة التحويل.
✅ استخدمت except للتعامل مع الخطأ.
✅ فهمت أن continue يرجع لبداية الحلقة.
✅ منعت إضافة المنتج عندما يكون السعر خاطئًا.
✅ اختبرت إدخالًا خاطئًا ثم صحيحًا.
✅ جعلت برنامج المشتريات أكثر قربًا للاستخدام الحقيقي.
إذا فهمت هذه النقاط: فأنت الآن تعرف كيف تجعل البرنامج يتعامل مع أخطاء المستخدم بدل أن ينهار أمامه.

خلاصة الدرس

تعلمنا أن try و except تساعدنا على حماية البرنامج من أخطاء متوقعة. استخدمناها مع float حتى لا ينهار البرنامج عند إدخال سعر غير رقمي.

تذكر القاعدة:

try:
    كود قد يسبب خطأ
except نوع_الخطأ:
    ماذا نفعل عند حدوث الخطأ

في الدرس القادم سنبدأ تجهيز المشروع النهائي بشكل أوضح، ونراجع بنية البرنامج قبل إضافة تحسينات احترافية أخيرة.