0Pricing
Python Academy · درس

فئات الاستثناءات المخصصة

عرّف أنواع الاستثناءات الخاصة بك لتوضيح رسائل الأخطاء

فئات الاستثناءات المخصصة درس مجاني في Python Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Python Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Python Academy 4 دروس في المجموع.

مقدمة

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

لماذا نستخدم الاستثناءات المخصصة؟

الاستثناءات المضمنة عامة أكثر من اللازم. وتتيح الاستثناءات المخصصة للمستدعين التقاط أخطاء مكتبتك أنت فقط، من دون التقاط الأخطاء غير المرتبطة بها.
class AppError(Exception):
    pass
raise AppError('something went wrong')

الوراثة من Exception

كل ما تحتاج إليه هو class MyError(Exception): pass. احرص دائمًا على الوراثة من Exception، وليس BaseException.
class ValidationError(Exception):
    pass
try:
    raise ValidationError('email is invalid')
except ValidationError as e:
    print(e)

إضافة سمات مخصصة

class APIError(Exception): def __init__(self, status, message): self.status = status; super().__init__(message)
class APIError(Exception):
    def __init__(self, status, message):
        self.status = status
        super().__init__(message)
try:
    raise APIError(404, 'Not found')
except APIError as e:
    print(e.status, e)

تسلسل الاستثناءات الهرمي

أنشئ تسلسلًا هرميًا: class DBError(AppError): pass — يمكن للمستدعين التقاط AppError لأي خطأ في التطبيق، أو التقاط DBError تحديدًا.
class AppError(Exception): pass
class DBError(AppError): pass
class NetworkError(AppError): pass
try:
    raise DBError('timeout')
except AppError as e:
    print('app error:', e)

دالة __str__ مخصصة

تجاوز __str__ للتحكم في شكل رسالة الاستثناء عند طباعتها.
class RangeError(ValueError):
    def __init__(self, val, lo, hi):
        self.val, self.lo, self.hi = val, lo, hi
    def __str__(self):
        return f'{self.val} not in [{self.lo}, {self.hi}]'
print(RangeError(15, 0, 10))

رفع الاستثناءات المخصصة

استخدم raise في دوالك للإبلاغ عن أخطاء خاصة بالمجال. ينشئ ذلك API واضحة للمستدعين.
class InsufficientFundsError(Exception):
    def __init__(self, needed, available):
        super().__init__(f'Need {needed}, have {available}')
def withdraw(balance, amount):
    if amount > balance:
        raise InsufficientFundsError(amount, balance)
    return balance - amount
try:
    withdraw(100, 200)
except InsufficientFundsError as e:
    print(e)

الالتقاط باستخدام الفئة الأساسية

يلتقط except AppError جميع الفئات الفرعية، مثل DBError وNetworkError وغيرها. ويتيح التسلسل الهرمي للمستدعين اختيار مستوى التحديد المناسب.
class AppError(Exception): pass
class DBError(AppError): pass
try:
    raise DBError('conn failed')
except AppError:
    print('any app error')

الاستثناء مع مدير السياق

تتكامل الاستثناءات المخصصة مع مديري السياق: تعيد class suppressed: __exit__ القيمة True لكبت الاستثناء.
class SuppressValue(Exception): pass
try:
    raise SuppressValue('ignored')
except SuppressValue:
    pass  # suppress silently
print('continued')

توثيق الاستثناءات المخصصة

وثّق متى ترفع الاستثناء وما الذي تعنيه سماته. تجعل سلاسل التوثيق الجيدة الاستثناءات المخصصة سهلة الاستخدام.
class ConfigError(Exception):
    """Raised when configuration is invalid.
    Attributes:
        key: The invalid config key
    """
    def __init__(self, key, msg):
        super().__init__(msg)
        self.key = key

أفضل الممارسات

اجعل التسلسل الهرمي سطحيًا، من مستويين إلى ثلاثة. احرص دائمًا على الوراثة من Exception. استخدم أسماء وصفية تنتهي بـ Error. ضعها في وحدة مخصصة باسم exceptions.py.
# Good structure:
class AppError(Exception): pass
class ValidationError(AppError): pass
class NotFoundError(AppError): pass
print('hierarchy demo')

تحقق سريع

ما الفئة التي ينبغي أن ترث منها الاستثناءات المخصصة لتجنب التقاط الأحداث التي تنهي النظام؟

مراجعة

ترث الاستثناءات المخصصة من Exception، وتضيف السمات داخل __init__، وتتجاوز __str__. أنشئ تسلسلات هرمية لتسهيل التقاطها. وضعها في وحدة exceptions.py.

تابع التقدم

أحسنت! انتقل إلى الدرس التالي لمواصلة تقدمك.

الأسئلة الشائعة

هل درس «فئات الاستثناءات المخصصة» مجاني؟

نعم — نص درس «فئات الاستثناءات المخصصة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Python Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Python Academy 4 دروس في المجموع.

ماذا ستتعلم في «فئات الاستثناءات المخصصة»؟

عرّف أنواع الاستثناءات الخاصة بك لتوضيح رسائل الأخطاء تتمرن على Python Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Python Academy؟

لا تُشترط خبرة سابقة. Python Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «فئات الاستثناءات المخصصة»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Python Academy هذا؟

نعم. كل درس في Python Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. فهم الاستثناءات
  2. try / except / else / finally
  3. رفع الاستثناءات وإعادة رفعها
  4. فئات الاستثناءات المخصصة
← العودة إلى Python Academy