أساسيات بايثون 31: شرح try و except في Python للمبتدئين

شرح try و except في Python للمبتدئين ضمن كورس أساسيات بايثون

عندما تبدأ في كتابة برامج Python، ستلاحظ أن الأخطاء جزء طبيعي من البرمجة. قد يكتب المستخدم نصًا بدل رقم، أو تحاول قراءة ملف غير موجود، أو تفتح ملفًا بترميز غير صحيح، أو تقسم رقمًا على صفر. في هذه الحالات قد يتوقف البرنامج فجأة إذا لم نتعامل مع الخطأ بطريقة صحيحة.

في هذا الدرس من كورس أساسيات بايثون على موقع بايثون العرب سنتعلم شرح try و except في Python للمبتدئين، وكيف نستخدمهما للتعامل مع الأخطاء بدل أن يتوقف البرنامج. سنبدأ بأمثلة بسيطة، ثم نطبقها على أخطاء شائعة مثل ValueError و ZeroDivisionError و FileNotFoundError.

{getToc} $title={محتوى المقال}

الفكرة ببساطة: نضع الكود الذي قد يسبب خطأ داخل try، ونضع طريقة التعامل مع الخطأ داخل except حتى لا يتوقف البرنامج فجأة. {alertInfo}

لماذا نحتاج إلى try و except؟

تخيل أنك كتبت برنامجًا يطلب من المستخدم إدخال عمره، ثم يحول الإدخال إلى رقم:

age = int(input("أدخل عمرك: "))
print("عمرك هو:", age)

إذا كتب المستخدم رقمًا مثل 20 سيعمل البرنامج بشكل طبيعي. لكن ماذا لو كتب المستخدم كلمة مثل Ali؟ هنا ستظهر مشكلة:

ValueError: invalid literal for int() with base 10

المشكلة أن البرنامج حاول تحويل نص غير رقمي إلى رقم، فتوقف. هنا يأتي دور try و except.

ما معنى try و except في Python؟

كلمة try تعني "جرّب". نضع داخلها الكود الذي قد يسبب خطأ. أما except فتعني "إذا حدث خطأ من نوع معين، نفذ هذا الجزء بدل أن يتوقف البرنامج".

الشكل العام:

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

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


شرح فكرة try و except في Python للتعامل مع الأخطاء ومنع توقف البرنامج

أول مثال بسيط على try و except

لنصلح مثال العمر السابق باستخدام try و except:

try:
    age = int(input("أدخل عمرك: "))
    print("عمرك هو:", age)

except ValueError:
    print("من فضلك أدخل رقمًا صحيحًا.")

إذا أدخل المستخدم رقمًا، سيظهر العمر. وإذا أدخل نصًا غير قابل للتحويل إلى رقم، لن يتوقف البرنامج، بل ستظهر رسالة واضحة:

من فضلك أدخل رقمًا صحيحًا.

هذا هو الهدف الأساسي من try و except: التعامل مع الأخطاء المتوقعة بطريقة مفهومة.

كيف يعمل try و except خطوة بخطوة؟

عندما يصل Python إلى كتلة try، يحدث الآتي:

  1. يحاول تنفيذ الكود الموجود داخل try.
  2. إذا لم يحدث خطأ، يتجاهل جزء except.
  3. إذا حدث خطأ، ينتقل مباشرة إلى except المناسب.
  4. ينفذ الكود الموجود داخل except.
  5. يكمل البرنامج بعد ذلك بدل أن يتوقف فجأة.

مثال:

try:
    print("قبل التحويل")
    number = int("abc")
    print("بعد التحويل")

except ValueError:
    print("حدث خطأ أثناء التحويل.")

print("نهاية البرنامج")

الناتج:

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

لاحظ أن جملة بعد التحويل لم تطبع؛ لأن الخطأ حدث قبلها، فانتقل Python إلى except.

مثال: التعامل مع ValueError

خطأ ValueError يحدث عندما تكون القيمة غير مناسبة للعملية المطلوبة. من أشهر أمثلته محاولة تحويل نص غير رقمي إلى رقم.

try:
    number = int(input("أدخل رقمًا: "))
    print("الرقم هو:", number)

except ValueError:
    print("هذا ليس رقمًا صحيحًا.")

هذا المثال مفيد جدًا في البرامج التي تعتمد على إدخال المستخدم.


مثال حل ValueError في Python باستخدام try و except عند تحويل النص إلى رقم

مثال: التعامل مع ZeroDivisionError

خطأ ZeroDivisionError يحدث عندما تحاول قسمة رقم على صفر.

مثال يسبب الخطأ:

result = 10 / 0
print(result)

سيظهر:

ZeroDivisionError: division by zero

الحل باستخدام try و except:

try:
    number = 10
    divider = 0
    result = number / divider
    print(result)

except ZeroDivisionError:
    print("لا يمكن القسمة على صفر.")

بهذه الطريقة نعطي المستخدم رسالة مفهومة بدل ظهور خطأ تقني طويل.

التعامل مع أكثر من نوع خطأ

أحيانًا قد يكون الكود معرضًا لأكثر من نوع خطأ. مثال: المستخدم يدخل رقمين، وقد يكتب نصًا بدل رقم، أو قد يكتب صفرًا في المقام.

try:
    a = int(input("أدخل الرقم الأول: "))
    b = int(input("أدخل الرقم الثاني: "))

    result = a / b
    print("الناتج:", result)

except ValueError:
    print("يجب إدخال أرقام فقط.")

except ZeroDivisionError:
    print("لا يمكن القسمة على صفر.")

هنا تعاملنا مع خطأين مختلفين برسالتين مختلفتين. وهذا أفضل من رسالة عامة لا توضح سبب المشكلة.

التعامل مع أكثر من خطأ في except واحدة

يمكنك أحيانًا وضع أكثر من نوع خطأ داخل except واحدة باستخدام Tuple:

try:
    number = int(input("أدخل رقمًا: "))
    result = 100 / number
    print(result)

except (ValueError, ZeroDivisionError):
    print("الإدخال غير مناسب أو الرقم يساوي صفرًا.")

هذا مناسب عندما تريد عرض رسالة واحدة لعدة أخطاء، لكن إذا كنت تريد رسائل دقيقة، فاستخدم except منفصلة لكل خطأ.

استخدام as error لمعرفة تفاصيل الخطأ

يمكنك حفظ تفاصيل الخطأ داخل متغير باستخدام as.

try:
    number = int("abc")

except ValueError as error:
    print("حدث خطأ:", error)

الناتج:

حدث خطأ: invalid literal for int() with base 10: 'abc'

هذه الطريقة مفيدة أثناء التطوير، لأنك ترى تفاصيل الخطأ وتفهم سببه. لكن عند عرض الرسالة للمستخدم النهائي، من الأفضل استخدام رسالة بسيطة ومفهومة.

مثال: try و except مع قراءة الملفات

من أكثر الأماكن التي نستخدم فيها try و except التعامل مع الملفات، لأن الملف قد لا يكون موجودًا، أو قد يكون المسار خطأ، أو قد يكون الترميز غير مناسب.

مثال قراءة ملف:

try:
    with open("data.txt", "r", encoding="utf-8") as file:
        content = file.read()

    print(content)

except FileNotFoundError:
    print("الملف غير موجود. تأكد من اسم الملف والمسار.")

إذا كان الملف غير موجود، لن يتوقف البرنامج فجأة، بل سيعرض رسالة واضحة.


استخدام try و except عند قراءة الملفات في Python والتعامل مع FileNotFoundError

التعامل مع UnicodeDecodeError عند قراءة ملف

في الدرس السابق من سلسلة مشكلة وحل، شرحنا خطأ UnicodeDecodeError. يمكنك التعامل معه أيضًا باستخدام try و except.

try:
    with open("data.csv", "r", encoding="utf-8") as file:
        content = file.read()

    print(content)

except UnicodeDecodeError:
    print("تعذر قراءة الملف بسبب مشكلة في الترميز.")
    print("جرّب utf-8-sig أو cp1256 حسب مصدر الملف.")

هذا مثال عملي يربط بين التعامل مع الأخطاء وقراءة الملفات.

استخدام else مع try و except

يمكنك إضافة else بعد try و except. جزء else يعمل فقط إذا لم يحدث أي خطأ داخل try.

try:
    number = int(input("أدخل رقمًا: "))

except ValueError:
    print("الإدخال ليس رقمًا.")

else:
    print("تم إدخال الرقم بنجاح:", number)

إذا أدخل المستخدم رقمًا، سيعمل جزء else. وإذا أدخل نصًا غير رقمي، سيعمل جزء except فقط.

متى أستخدم else؟

استخدم else عندما تريد تنفيذ كود معين فقط في حالة نجاح try بدون أخطاء.

مثال:

try:
    price = float(input("أدخل السعر: "))

except ValueError:
    print("السعر يجب أن يكون رقمًا.")

else:
    discount = price * 0.10
    print("قيمة الخصم:", discount)

هنا لا نحسب الخصم إلا إذا كان إدخال السعر صحيحًا.

استخدام finally في Python

جزء finally يعمل دائمًا سواء حدث خطأ أو لم يحدث. يستخدم عادة لتنفيذ خطوة أخيرة، مثل إغلاق اتصال أو طباعة رسالة انتهاء.

try:
    number = int(input("أدخل رقمًا: "))
    print(number)

except ValueError:
    print("حدث خطأ في الإدخال.")

finally:
    print("انتهت محاولة التنفيذ.")

سواء أدخل المستخدم رقمًا أو نصًا خاطئًا، سيتم تنفيذ finally.

الشكل الكامل لـ try و except و else و finally

يمكنك استخدام الأجزاء الأربعة معًا بهذا الشكل:

try:
    # الكود الذي قد يسبب خطأ
    pass

except ValueError:
    # التعامل مع خطأ معين
    pass

else:
    # يعمل إذا لم يحدث خطأ
    pass

finally:
    # يعمل دائمًا
    pass

للمبتدئ، لا تحتاج إلى استخدام كل هذه الأجزاء دائمًا. غالبًا ستبدأ بـ try و except فقط، ثم تتعلم else و finally حسب الحاجة.

هل يجب استخدام try و except حول كل الكود؟

لا. هذا خطأ شائع. لا تضع البرنامج كله داخل try كبيرة بدون سبب. الأفضل أن تضع فقط الجزء الذي تتوقع أن يسبب خطأ.

مثال غير جيد:

try:
    # كل البرنامج هنا
    pass
except:
    print("حدث خطأ.")

الأفضل:

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

بهذا يكون التعامل مع الخطأ واضحًا ومحددًا.

لماذا لا نستخدم except عامة دائمًا؟

قد ترى كودًا مثل:

try:
    number = int("abc")
except:
    print("حدث خطأ.")

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

الأفضل أن تكتب:

try:
    number = int("abc")
except ValueError:
    print("القيمة غير قابلة للتحويل إلى رقم.")
نصيحة مهمة: حدد نوع الخطأ في except قدر الإمكان. هذا يجعل الكود أوضح ويمنع إخفاء أخطاء غير متوقعة. {alertWarning}

أخطاء شائعة عند استخدام try و except


أفضل ممارسات استخدام try و except في Python للمبتدئين وتجنب الأخطاء الشائعة

1. استخدام except بدون تحديد الخطأ

هذا قد يخفي أخطاء كثيرة. الأفضل تحديد الخطأ مثل ValueError أو FileNotFoundError.

2. وضع كود كبير جدًا داخل try

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

3. عرض رسالة عامة جدًا

بدلًا من:

print("خطأ")

اكتب رسالة مفهومة:

print("الملف غير موجود. تأكد من اسم الملف.")

4. استخدام try و except لإخفاء الأخطاء بدل حلها

try و except ليست طريقة لتجاهل المشاكل. هي طريقة للتعامل مع الأخطاء المتوقعة بطريقة آمنة وواضحة.

5. استخدام pass داخل except بدون سبب

بعض المبتدئين يكتبون:

try:
    number = int("abc")
except ValueError:
    pass

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

أفضل ممارسات try و except في Python

  • استخدم try فقط حول الكود المتوقع أن يسبب خطأ.
  • حدد نوع الخطأ داخل except قدر الإمكان.
  • اكتب رسائل واضحة للمستخدم.
  • لا تستخدم except عامة إلا عند الحاجة وفهم السبب.
  • لا تستخدم pass لإخفاء الأخطاء بدون سبب.
  • استخدم as error أثناء التطوير لفهم تفاصيل الخطأ.
  • استخدم else للكود الذي يعمل فقط عند نجاح try.
  • استخدم finally للخطوات التي يجب تنفيذها دائمًا.

مثال عملي كامل: برنامج قسمة آمن

لنكتب برنامجًا بسيطًا يطلب من المستخدم رقمين، ثم يقسم الأول على الثاني، مع التعامل مع الأخطاء المحتملة.

try:
    first_number = float(input("أدخل الرقم الأول: "))
    second_number = float(input("أدخل الرقم الثاني: "))

    result = first_number / second_number

except ValueError:
    print("يجب إدخال أرقام فقط.")

except ZeroDivisionError:
    print("لا يمكن القسمة على صفر.")

else:
    print("الناتج هو:", result)

finally:
    print("انتهى البرنامج.")

هذا المثال يجمع بين try و except و else و finally بطريقة عملية.

مثال عملي: قراءة ملف بطريقة آمنة

هذا مثال آخر يقرأ ملفًا نصيًا ويتعامل مع أشهر أخطاء القراءة:

try:
    with open("notes.txt", "r", encoding="utf-8") as file:
        content = file.read()

except FileNotFoundError:
    print("الملف غير موجود.")

except UnicodeDecodeError:
    print("حدثت مشكلة في ترميز الملف.")

else:
    print(content)

هذا الأسلوب مناسب عند قراءة ملفات قد تكون غير موجودة أو غير محفوظة بترميز مناسب.

تدريب عملي

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

المطلوب:

  1. استخدم input() لطلب رقم من المستخدم.
  2. حوّل الإدخال إلى رقم باستخدام int().
  3. استخدم try و except ValueError.
  4. إذا كان الإدخال صحيحًا، اطبع مربع الرقم.

حل مختصر للتدريب

try:
    number = int(input("أدخل رقمًا: "))
    square = number * number
    print("مربع الرقم:", square)

except ValueError:
    print("من فضلك أدخل رقمًا صحيحًا.")

ماذا تعلمنا في هذا الدرس؟

  • تعلمنا معنى try و except في Python.
  • عرفنا كيف نمنع توقف البرنامج عند حدوث خطأ متوقع.
  • تعاملنا مع أخطاء مثل ValueError و ZeroDivisionError.
  • استخدمنا try و except مع قراءة الملفات.
  • تعلمنا استخدام else عند نجاح الكود.
  • تعلمنا استخدام finally لتنفيذ كود في كل الحالات.
  • راجعنا أفضل الممارسات والأخطاء الشائعة.

روابط داخلية مفيدة من بايثون العرب

مصادر خارجية مفيدة للتوسع

الخلاصة

try و except من أهم الأدوات في Python للتعامل مع الأخطاء المتوقعة. بدل أن يتوقف البرنامج عند إدخال خاطئ أو ملف غير موجود، يمكنك عرض رسالة واضحة للمستخدم ومتابعة التنفيذ بطريقة أفضل.

ابدأ باستخدامهما مع الحالات البسيطة مثل تحويل النص إلى رقم أو قراءة ملف. ومع الوقت ستتعلم كيف تبني برامج أكثر استقرارًا وتتعامل مع الأخطاء بطريقة احترافية.

الخلاصة العملية: استخدم try للكود الذي قد يسبب خطأ، واستخدم except للتعامل مع نوع الخطأ المتوقع برسالة واضحة ومحددة. {alertSuccess}

أسئلة شائعة مع إجاباتها

ما معنى try في Python؟

تعني جرّب تنفيذ هذا الكود، وإذا حدث خطأ ينتقل Python إلى جزء except المناسب.

ما معنى except في Python؟

تستخدم except لتحديد ما الذي يجب فعله إذا حدث خطأ معين داخل try.

هل try و except تمنع الأخطاء تمامًا؟

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

هل أستخدم except بدون تحديد نوع الخطأ؟

الأفضل عدم فعل ذلك إلا عند الحاجة؛ لأن except العامة قد تخفي أخطاء مهمة. حدد نوع الخطأ مثل ValueError أو FileNotFoundError.

ما فائدة else مع try و except؟

جزء else يعمل فقط إذا لم يحدث أي خطأ داخل try.

ما فائدة finally في Python؟

جزء finally يعمل دائمًا سواء حدث خطأ أو لم يحدث، ويستخدم لتنفيذ خطوات أخيرة يجب تنفيذها في كل الأحوال.

إرسال تعليق

أحدث أقدم