تكرار السؤال: …
الإجابة المختصرة
ارمِ استثناءً يعبر عن سبب الفشل بدقة (مثل ValueError أو KeyError أو استثناء domain خاص)، والتقط أضيق نوع تستطيع معالجته فعلًا بدل except Exception في كل مكان.
الشرح
ترث الاستثناءات العادية من Exception، بينما ترث KeyboardInterrupt و SystemExit من BaseException مباشرة؛ لذلك يبتلع except: الفارغ أو except BaseException إشارات الإيقاف ويمنع إغلاق البرنامج. التقط الاستثناء في الطبقة التي تملك قرار التعافي أو تحويله إلى خطأ مفهوم، واترك الباقي ينتشر. الـ except Exception العام مقبول في نقطة الحدود العليا (مثل handler الطلب) للتسجيل وإرجاع 500.
مثال بالكود
def parse_age(raw: str) -> int:
try:
age = int(raw)
except ValueError:
raise ValueError(f"invalid age: {raw!r}") from None
if age < 0:
raise ValueError("age must be positive")
return ageأخطاء شائعة
- كتابة except: pass فتختفي كل الأخطاء بما فيها Ctrl+C.
- التقاط Exception في طبقة لا تعرف كيف تتعافى ثم الاستمرار بحالة غير صحيحة.