الدرس 9 من 10
استثناءات من صنعك
- 14 دقيقة
- 6 معايير للتصحيح
- 3 تلميحات
- إلى المطلوب
هدف الدرس
التقط ما تستطيع معالجته فقط
الشرح
الاستثناءات الجاهزة مثل ValueError وKeyError عامّة: لا تقول إن كان الخطأ في إعداداتك أم في مكان آخر. لذلك تعرّف المكتبات عائلتها الخاصّة: صنف أساسي يرث Exception، وأبناء له لكل حالة. فيلتقط المستدعي ما يستطيع معالجته بالضبط: except ConfigError يلتقط العائلة كلها، وexcept MissingKeyError حالة واحدة منها.
وحين تحوّل خطأً منخفض المستوى إلى خطأ من عائلتك اكتب raise MissingKeyError("port") from err. فيبقى الأصل في __cause__، ويعرض التتبّع الخطأين معًا بدل أن يضيع السبب.
والفخّ في الكود الحالي: except Exception يبتلع كل شيء، حتى أخطاءك أنت. مفتاح غائب، أو قيمة فاسدة، أو خطأ إملائي في اسم المفتاح، كلها تعود بصمت بالمنفذ 8000، ولن تعرف أن الإعدادات معطوبة إلا في الإنتاج.
المطلوب
عرّف ConfigError يرث Exception، وMissingKeyError(key) يرثه ويحفظ key. ثم اجعل read_port(config) تُرجع المنفذ عددًا، وترمي MissingKeyError إن غاب المفتاح وConfigError إن لم تكن قيمته رقمًا، كلاهما بـfrom.
معايير التصحيح
6 معايير- ConfigError يرث Exception
- MissingKeyError من عائلة ConfigError
- read_port تُرجع المنفذ عددًا
- المفتاح الغائب يرمي MissingKeyError يحمل اسمه
- السبب الأصلي محفوظ بـ from
- القيمة غير الرقمية ترمي ConfigError وسببه ValueError