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