معالجة الأخطاء في Python (try / except)

10:00 دقائق مجاني
في هذا الدرس ستتعلم كيف تتعامل مع الأخطاء باستخدام try و except حتى لا يتوقف برنامجك فجأة

أحيانًا يواجه برنامجك خطأ (Error) بسبب إدخال المستخدم أو ملف غير موجود أو قسمة على صفر. إذا لم نعالج الخطأ، سيتوقف البرنامج فورًا. في Python نستخدم try / except حتى نستمر بشكل آمن.

مثال على خطأ شائع

إذا حاولنا تحويل نص إلى رقم بدون تحقق، سيظهر خطأ:


age = int(input("اكتب عمرك: "))
print(age)

إذا كتب المستخدم كلمة بدل رقم، البرنامج سيتوقف.

استخدام try و except


try:
    age = int(input("اكتب عمرك: "))
    print("عمرك هو:", age)
except:
    print("خطأ: لازم تكتب رقم فقط")

إذا حدث خطأ داخل try، ينتقل التنفيذ إلى except بدل إيقاف البرنامج.

مثال: القسمة على صفر


try:
    x = int(input("اكتب رقم: "))
    y = int(input("اكتب رقم آخر: "))
    print(x / y)
except:
    print("خطأ: لا يمكن القسمة على صفر أو إدخال غير صحيح")

تحديد نوع الخطأ (أفضل)

الأفضل أن تحدد نوع الخطأ بدل except العام:


try:
    age = int(input("اكتب عمرك: "))
    print(age)
except ValueError:
    print("خطأ: أدخل رقم صحيح")

هنا نعالج خطأ التحويل فقط (ValueError).

استخدام else مع try

كتلة else تعمل فقط إذا لم يحدث أي خطأ.


try:
    x = int(input("اكتب رقم: "))
except ValueError:
    print("خطأ: أدخل رقم")
else:
    print("نجاح! الرقم هو:", x)

استخدام finally

كتلة finally تعمل دائمًا سواء حدث خطأ أو لا. مفيدة لإغلاق الملفات أو تنظيف الموارد.


file = None
try:
    file = open("data.txt", "r")
    print(file.read())
except FileNotFoundError:
    print("الملف غير موجود")
finally:
    if file:
        file.close()

أخطاء شائعة

  • استخدام except بدون فهم (يصير يخفي أخطاء مهمة)
  • كتابة كود كبير جدًا داخل try بدل تحديد الجزء الخطر فقط
  • نسيان معالجة الأخطاء المتوقعة مثل FileNotFoundError

تمرين للتطبيق

اكتب برنامج:

  • يسأل المستخدم عن رقمين
  • يقسم الأول على الثاني
  • يعالج خطأ إدخال نص أو القسمة على صفر

لماذا نعالج الأخطاء بدل تجاهلها؟

البرنامج المثالي في ذهن المبتدئ هو الذي «لا يخطئ». لكن الحقيقة أن المستخدم سيُدخل نصًا مكان رقم، والملف قد لا يوجد، والاتصال قد ينقطع. البرنامج المحترف ليس الذي لا تحدث فيه أخطاء، بل الذي يتوقّعها ويتعامل معها بهدوء بدل أن ينهار أمام المستخدم.

تشبيه: try و except كحزام الأمان. لا تنوي أن تصطدم، لكنك تضعه تحسّبًا. الكود الخطر يوضع داخل try، وخطة الطوارئ داخل except — فيكمل البرنامج بدل أن يتوقّف فجأة.

نصيحة: لا تخفِ الأخطاء المهمة

يقع المبتدئ في فخّ معاكس: يضع except عامًّا يبتلع كل الأخطاء بصمت. المشكلة أن هذا يخفي أخطاء حقيقية في كودك ويصعّب اكتشافها لاحقًا.

الأفضل أن تحدّد نوع الخطأ الذي تتوقّعه (مثل خطأ تحويل النص إلى رقم) وتعالجه وحده، وتترك بقية الأخطاء تظهر لتصلحها. وتذكّر أن الجزء الموضوع داخل try يجب أن يكون أصغر ما يمكن — فقط السطر الخطر، لا نصف البرنامج.

من واقع الإنتاج: الأخطاء التي تتعامل معها بهدوء

معالجة الأخطاء هي ما يفرّق بين كود تجريبي وكود حقيقي يستخدمه الناس. بصفتي مطوّرًا أطلقت برامج يستعملها مستخدمون فعليون، أؤكّد أن المستخدم سيفعل ما لم تتوقّعه: سيُدخل حرفًا مكان رقم، ويترك حقلًا فارغًا، ويرفع ملفًا تالفًا.

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

ماذا بعد هذا الدرس؟

الدرس القادم: مشروع تطبيقي بسيط

سنطبق ما تعلمناه في برنامج صغير يجمع المتغيرات + الشروط + الحلقات + الدوال.