Python Tutorials

إتقان معالجة الاستثناءات في بايثون

Spread the love

يُعَدّ معالجة الاستثناءات مكوّناً بالغ الأهمية في برمجة بايثون القوية. فهي تسمح لك بإدارة الأخطاء التي قد تنشأ أثناء تنفيذ البرنامج بشكلٍ أنيق، مما يمنع التعطلات ويوفر للمستخدمين تغذية راجعة مُفيدة. يتعمّق هذا البرنامج التعليمي في المفاهيم الأساسية لمعالجة الاستثناءات في بايثون.

جدول المحتويات

  1. try…except
  2. raise Exception
  3. try…finally
  4. الاستثناءات المُدمجة الشائعة
  5. إنشاء استثناءات مخصصة

1. try…except

يُشَكِّل كتلة try...except أساس معالجة الاستثناءات. يتم وضع التعليمات البرمجية التي قد تُولِّد استثناءً داخل كتلة try. إذا حدث استثناء، يتم تنفيذ كتلة except المُناظرة.


try:
    result = 10 / 0  # هذا سيُولِّد خطأ ZeroDivisionError
except ZeroDivisionError:
    print("خطأ: القسمة على صفر!")
except TypeError:
    print("خطأ: عدم تطابق النوع")
except Exception as e:  # يلتقط أي استثناء آخر
    print(f"حدث خطأ غير متوقع: {e}")
else:  # كتلة else اختيارية، يتم تنفيذها إذا لم يحدث أي استثناء
    print(f"النتيجة: {result}")
finally:  # كتلة finally اختيارية، يتم تنفيذها دائمًا
    print("يتم تنفيذ هذا دائمًا.")

يوضّح هذا المثال كيفية معالجة خطأ ZeroDivisionError. يمكن لكتل except المُتعددة معالجة أنواع استثناءات مُختلفة. يتم تنفيذ كتلة else الاختيارية فقط إذا لم يحدث أي استثناء في كتلة try. تُنفَّذ كتلة finally الاختيارية دائمًا، وهي مثالية لمهام التنظيف مثل إغلاق الملفات.

2. raise Exception

تتيح لك عبارة raise إثارة الاستثناءات صراحةً، مما يُشير إلى الأخطاء أو الظروف الاستثنائية.


def validate_age(age):
    if age < 0:
        raise ValueError("العمر لا يمكن أن يكون سالبًا")
    elif age > 120:
        raise ValueError("العمر مرتفع بشكل غير واقعي")
    return age

try:
    age = validate_age(-5)
    print(f"عمر صحيح: {age}")
except ValueError as e:
    print(f"خطأ: {e}")

هنا، تُولِّد دالة validate_age استثناء ValueError إذا كان العمر غير صالح. يمكنك إثارة أي استثناء مُدمج أو إنشاء استثناءات مخصصة (فئات تُورث من Exception).

3. try…finally

تضمن كتلة finally أن التعليمات البرمجية بداخلها تُنفَّذ دائمًا، بغض النظر عن الاستثناءات. وهي ضرورية للتنظيف.


file = None
try:
    file = open("my_file.txt", "r")
    content = file.read()
    print(content)
except FileNotFoundError:
    print("لم يتم العثور على الملف!")
finally:
    if file:
        file.close()
    print("تم إغلاق الملف.")

هذا يضمن إغلاق الملف حتى إذا حدث خطأ FileNotFoundError، مما يمنع تسرب الموارد.

4. الاستثناءات المُدمجة الشائعة

توفر بايثون العديد من الاستثناءات المُدمجة:

  • ZeroDivisionError: القسمة على صفر.
  • TypeError: نوع غير مُناسب لعملية.
  • ValueError: النوع صحيح، القيمة غير مُناسبة.
  • FileNotFoundError: لم يتم العثور على الملف.
  • IndexError: مؤشر خارج النطاق.
  • KeyError: لم يتم العثور على المفتاح في القاموس.
  • ImportError: فشل الاستيراد.
  • NameError: لم يتم العثور على الاسم.

5. إنشاء استثناءات مخصصة

للحصول على معالجة أخطاء أكثر تحديدًا، أنشئ استثناءات مخصصة من خلال اشتقاق فئة Exception:


class InvalidInputError(Exception):
    pass

def process_data(data):
    if not data:
        raise InvalidInputError("لا يمكن أن تكون البيانات فارغة")
    # ...باقي معالجة البيانات...

try:
    process_data("")
except InvalidInputError as e:
    print(f"خطأ مخصص: {e}")

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

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

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *