الانتقال إلى المحتوى الرئيسي
الوحدة 2 · الدرس 4 من 48/36 في الدورة~12 min
دروس الوحدة (4/4)

معالجة الأخطاء: حاول/باستثناء

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

الشكل الأساسي

Python
try:
    risultato = 10 / 0
except ZeroDivisionError:
    risultato = None
risultato  # None
  • تحتوي الكتلة try: على رمز قد يفشل؛
  • يتم تنفيذ except <ErrorType>: فقط في حالة ظهور نوع الخطأ هذا داخل try.

التقاط رسالة الاستثناء

استخدم as لربط كائن الاستثناء بالاسم:

Python
try:
    int("non è un numero")
except ValueError as e:
    messaggio = str(e)
messaggio  # "invalid literal for int() with base 10: 'non è un numero'"

أنواع متعددة معًا

Python
try:
    valore = dati[chiave]
except (KeyError, IndexError):
    valore = None

مجموعة من الأنواع تلتقط أي استثناء من تلك الأنواع (أو الفئات الفرعية).

البنية الكاملة: حاول / باستثناء / آخر / أخيرًا

Python
try:
    n = int("42")
except ValueError:
    print("not a number")
else:
    print(f"parsed: {n}")     # executed only if NO exception occurred
finally:
    print("always executed")  # executed regardless, even on exception
  • else — استخدمه للرمز الذي يعتمد على نجاح try. احتفظ بها منفصلة حتى لا تلتقط عن طريق الخطأ استثناءات غير ذات صلة.
  • finally — عملية التنظيف التي يجب أن تحدث دائمًا (إغلاق ملف، وتحرير ملف الموارد). يتم تنفيذها عند النجاح والخطأ.

رفع استثناء: raise

في بعض الأحيان تكون أنت الشخص الذي يريد الإشارة إلى حدوث خطأ ما:

Python
def diviso(a, b):
    if b == 0:
        raise ValueError("the divisor cannot be zero")
    return a / b

الاستثناءات المضمنة الأكثر شيوعًا التي ستواجهها وتثيرها:

  • ValueError — القيمة من النوع الصحيح ولكنها غير مقبولة (على سبيل المثال، التحليل).
  • TypeError — النوع خاطئ (على سبيل المثال len(42)).
  • KeyError / IndexError — مفتاح/فهرس مفقود.
  • ZeroDivisionError — القسمة على صفر.
  • FileNotFoundError، PermissionError — عمليات نظام الملفات.

الجمل الأخرى والأخيرة في كتل المحاولة

يمكن للكتلة try تعريف جملتين إضافيتين:

  • else: يتم تنفيذه فقط في حالة اكتمال الكتلة try دون إثارة أي استثناءات.
  • finally: يتم تنفيذه دائمًا، بغض النظر عما إذا حدث استثناء أم لا. يعد هذا مثاليًا لتنظيف الموارد (مثل إغلاق ملف مفتوح أو اتصال بقاعدة البيانات).

جربه بنفسك

تمرين#python.m2.l4.e1
المحاولات: 0جارٍ التحميل…

اكتب تعبيرًا يحاول int('abc'): إذا تم رفع ValueError، فقم بتعيين السلسلة 'errore' إلى `result`؛ وإلا قم بتعيين الرقم. تقييم "النتيجة".

جارٍ تحميل المحرر…
إظهار التلميح

int('abc') يرفع ValueError.

الحل متاح بعد 3 من المحاولات

تمرين المراجعة

تمرين#python.m2.l4.e2
المحاولات: 0جارٍ التحميل…

حدد "divide(a, b)" الذي يُرجع a/b لكنه يرفع ValueError مع الرسالة "قسمة صفر" إذا كانت b تساوي 0. ثم اتصل بـdivide(10, 0) داخل محاولة/باستثناء وقم بتعيين سلسلة الاستثناء الذي تم اكتشافه إلى "رسالة".

جارٍ تحميل المحرر…
إظهار التلميح

رفع ValueError('...') داخل الوظيفة؛ امسك باستثناء ValueError كـ e.

الحل متاح بعد 3 من المحاولات

التحدي الإضافي

تمرين#python.m2.l4.e3
المحاولات: 0جارٍ التحميل…

اكتب كتلة \`try-except\` لتحويل السلسلة \`text_val = "abc"\` إلى عدد صحيح. إذا أدى التحويل إلى ظهور \`ValueError\`، فقم بتعيين \`لا شيء\` إلى \`النتيجة\`. بخلاف ذلك، قم بتعيين الرقم المحول. وأخيرًا، قم بتقييم \`النتيجة\`.

جارٍ تحميل المحرر…
إظهار التلميح

استخدم المحاولة: النتيجة = int(text_val) متبوعة باستثناء ValueError: النتيجة = لا شيء.

الحل متاح بعد 3 من المحاولات