تكرار السؤال: …
الإجابة المختصرة
عندما يحتاج المستدعي إلى تمييز نوع فشل معين في الـ domain واتخاذ قرار مختلف بناءً عليه، أو عندما تحتاج إرفاق بيانات منظمة مع الخطأ.
الشرح
أنشئ استثناءً أساسيًا لمكتبتك أو موديولك (مثل PaymentError يرث Exception)، ثم أنواعًا فرعية للحالات التي تُعالج بشكل مختلف (مثل CardDeclined). هذا يسمح للمستدعي بالتقاط كل أخطاء المكتبة أو حالة محددة فقط. اجعل الاسم يعبر عن السبب وأضف الحقول المفيدة كخصائص. لا تنشئ class لكل رسالة نصية؛ فالقيمة الحقيقية في قابلية الالتقاط والبيانات المصاحبة.
مثال بالكود
class PaymentError(Exception):
"""Base error for the payments module."""
class CardDeclined(PaymentError):
def __init__(self, reason: str, retryable: bool = False):
super().__init__(f"card declined: {reason}")
self.reason = reason
self.retryable = retryable
try:
charge(order)
except CardDeclined as err:
if err.retryable:
schedule_retry(order)أخطاء شائعة
- الوراثة من BaseException بدل Exception.
- إنشاء عشرات الاستثناءات التي لا يلتقطها أحد بشكل منفصل.