تكرار السؤال: …
الإجابة المختصرة
تربط الاستثناء الجديد بالسبب الأصلي عبر __cause__، فيظهر الـ traceback كاملًا بعبارة "The above exception was the direct cause..."، مما يحافظ على سياق التشخيص.
الشرح
عند حدود الطبقات حوّل أخطاء المكتبات الداخلية (مثل KeyError أو أخطاء قاعدة البيانات) إلى أخطاء domain مفهومة، مع إبقاء السبب الأصلي عبر from. بدون from تربط Python الاستثناءين ضمنيًا عبر __context__ برسالة "During handling... another exception occurred" التي توحي بخطأ في معالج الاستثناء نفسه. استخدم from None فقط عندما يكون إخفاء السبب مقصودًا، مثل إخفاء تفاصيل داخلية لا تفيد المستخدم.
مثال بالكود
class ConfigError(Exception):
pass
def load_port(env: dict[str, str]) -> int:
try:
return int(env["PORT"])
except KeyError as err:
raise ConfigError("PORT is not set") from err
except ValueError as err:
raise ConfigError("PORT must be a number") from errأخطاء شائعة
- رمي استثناء جديد بدون from فيضيع السبب الحقيقي أو يظهر بصيغة مضللة.
- استخدام from None افتراضيًا مما يصعّب تتبع الأخطاء في الإنتاج.