الاستثناءات المعرفة من قبل المستخدم في بيثون مع أمثلة

الاستثناءات المعرفة من قبل المستخدم في بيثون مع أمثلة

يتم إنشاء الاستثناءات المعرفة من قبل المستخدم عن طريق تحديد فئة جديدة ترث منها الاستثناء المدمج في بايثون الفئة أو أحد فئاتها الفرعية. من خلال القيام بذلك، يمكننا إنشاء رسائل خطأ مخصصة والتعامل مع أخطاء محددة بطريقة منطقية لتطبيقنا.

خطوات إنشاء واستخدام الاستثناءات المحددة من قبل المستخدم

اتبع هذه الخطوات لإنشاء واستخدام الاستثناءات المحددة بواسطة المستخدم في بايثون:

  • تحديد فئة استثناء جديدة: قم بإنشاء فئة جديدة ترث من الاستثناء أو أي من فئاته الفرعية.
  • رفع الاستثناء: استخدم عبارة الرفع لرفع الاستثناء المحدد من قبل المستخدم عند حدوث شرط معين.
  • التعامل مع الاستثناء: استخدم كتل المحاولة باستثناء التعامل مع الاستثناء المحدد من قبل المستخدم.

مثال: في هذا المثال، قمنا بإنشاء استثناء مخصص InvalidAgeError للتأكد من أن قيم العمر تقع ضمن نطاق صالح (0–120).

Python
   # Step 1: Define a custom exception class   class   InvalidAgeError  (  Exception  ):   def   __init__  (  self     age     msg  =  'Age must be between 0 and 120'  ):   self  .  age   =   age   self  .  msg   =   msg   super  ()  .  __init__  (  self  .  msg  )   def   __str__  (  self  ):   return   f  '  {  self  .  age  }   ->   {  self  .  msg  }  '   # Step 2: Use the custom exception in your code   def   set_age  (  age  ):   if   age    <   0   or   age   >   120  :   raise   InvalidAgeError  (  age  )   else  :   print  (  f  'Age set to:   {  age  }  '  )   # Step 3: Handling the custom exception   try  :   set_age  (  150  )   # This will raise the custom exception   except   InvalidAgeError   as   e  :   print  (  e  )   

الإخراج
150 -> Age must be between 0 and 120  

توضيح:

  • فئة InvalidAgeError ترث من الاستثناء. وهو يحدد __حار__ طريقة قبول العمر والرسالة.
  • يقوم الأسلوب __str__ بإرجاع تمثيل سلسلة قابلة للقراءة للخطأ.
  • في set_age() إذا كان العمر خارج النطاق الصالح (0-120)، فسيتم رفع الاستثناء.
  • تلتقط كتلة المحاولة باستثناء الاستثناء وتطبع رسالة الخطأ.

تخصيص فئات الاستثناء

عندما نقوم بإنشاء استثناء مخصص، فإننا نصنف فئة فرعية من فئة الاستثناء المضمنة في Python (أو فئة فرعية مثل ValueError TypeError وما إلى ذلك). يمكننا بعد ذلك إضافة أساليب السمات الخاصة بنا أو المنطق المخصص لجعل الاستثناء أكثر إفادة.

يمكننا أيضًا تحسين الاستثناءات المخصصة عن طريق إضافة سمات إضافية أو طرق تجاوز.

مثال: نقوم هنا بتحسين InvalidAgeError عن طريق إضافة رمز خطأ وتخصيص رسالة الخطأ.

Python
   class   InvalidAgeError  (  Exception  ):   def   __init__  (  self     age     msg  =  'Age must be between 0 and 120'     error_code  =  1001  ):   self  .  age   =   age   self  .  msg   =   msg   self  .  error_code   =   error_code   super  ()  .  __init__  (  self  .  msg  )   def   __str__  (  self  ):   return   f  '[Error Code   {  self  .  error_code  }  ]   {  self  .  age  }   ->   {  self  .  msg  }  '   try  :   set_age  (  150  )   # This will raise the custom exception   except   InvalidAgeError   as   e  :   print  (  e  )   

الإخراج
[Error Code 1001] 150 -> Age must be between 0 and 120  

توضيح:

  • يحتوي InvalidAgeError الآن على سمة إضافية error_code.
  • تم تجاوز طريقة __str__ لعرض كل من رمز الخطأ والعمر.
  • عند تنفيذ set_age(150)، يتم رفع الاستثناء واحتجازه في كتلة المحاولة باستثناء.
  • تتم طباعة رسالة الخطأ المخصصة مما يجعل الخطأ أكثر وصفًا.

استخدام الاستثناءات القياسية كفئة أساسية

في بعض الأحيان، بدلاً من الوراثة مباشرة من الاستثناء، يمكننا إنشاء استثناء مخصص عن طريق تصنيف استثناء قياسي إلى فئة فرعية مثل RuntimeError ValueError وما إلى ذلك. يكون هذا مفيدًا عندما يجب التعامل مع الاستثناء المخصص الخاص بك كنوع معين من الأخطاء.

مثال: يوضح هذا المثال كيفية إنشاء استثناء مخصص NetworkError عن طريق الوراثة من RuntimeError وهو استثناء قياسي مدمج.

Python
   # NetworkError has base RuntimeError and not Exception   class   NetworkError  (  RuntimeError  ):   def   __init__  (  self     arg  ):   self  .  args   =   (  arg  )   # store as tuple   try  :   raise   NetworkError  (  'Connection failed'  )   except   NetworkError   as   e  :   print  (  e  .  args  )   

الإخراج
('Connection failed')  

توضيح:

  • يرث NetworkError من RuntimeError وهو نوع استثناء مضمن.
  • عند رفع الرسالة، يتم تخزينها في سمة args على شكل صف.
  • يتم اكتشاف الاستثناء ويتم عرض الوسائط المخزنة الخاصة به.

مثال من العالم الحقيقي: خطأ في البريد الإلكتروني غير صالح

فيما يلي مثال بسيط حيث نطرح استثناءً مخصصًا إذا كان عنوان البريد الإلكتروني غير صالح:

Python
   class   InvalidEmailError  (  Exception  ):   def   __init__  (  self     email     msg  =  'Invalid email format'  ):   self  .  email   =   email   self  .  msg   =   msg   super  ()  .  __init__  (  self  .  msg  )   def   __str__  (  self  ):   return   f  '  {  self  .  email  }   ->   {  self  .  msg  }  '   def   set_email  (  email  ):   if   '@'   not   in   email  :   raise   InvalidEmailError  (  email  )   print  (  f  'Email set to:   {  email  }  '  )   try  :   set_email  (  'userexample.com'  )   except   InvalidEmailError   as   e  :   print  (  e  )   

الإخراج
userexample.com -> Invalid email format  

توضيح:

  • تم تعريف فئة استثناء جديدة InvalidEmailError للتحقق من صحة عناوين البريد الإلكتروني.
  • إذا كان البريد الإلكتروني المحدد لا يحتوي على "@"، فسيتم طرح الاستثناء.
  • تكتشف كتلة المحاولة باستثناء الخطأ وتطبع الرسالة المنسقة.

متى يتم استخدام الاستثناءات المحددة من قبل المستخدم؟

ينبغي أخذ الاستثناءات المعرفة من قبل المستخدم في الاعتبار في السيناريوهات التالية:

  • تمثيل أخطاء محددة في أحد التطبيقات (مثل InvalidAgeError DatabaseConnectionError).
  • توفير رسائل خطأ أكثر وضوحًا ووصفًا.
  • معالجة مجموعة من الأخطاء المرتبطة بشكل منفصل باستخدام باستثناء.

باستخدام الاستثناءات المحددة من قبل المستخدم، تصبح البرامج أكثر قابلية للقراءة والصيانة وأسهل في التصحيح.

مسابقة مقترحة تحرير الاختبار 3 أسئلة

ماذا يحدث إذا ورث استثناء محدد من قبل المستخدم من RuntimeError بدلاً من الاستثناء؟

  • أ

    ولا يمكن الإمساك به باستخدام إلا

  • ب

    يصبح استثناءً غير محدد

  • ج

    يتم التعامل معه على أنه خطأ متعلق بوقت التشغيل بواسطة المعالجات

  • د

    فإنه يفقد السمات المخصصة

توضيح:

يتيح الوراثة من RuntimeError التعامل معه كخطأ في وقت التشغيل بالإضافة إلى خطأ مخصص.

لماذا يتم استخدام super().__init__(self.msg) بشكل شائع في فئات الاستثناءات المخصصة؟

  • أ

    لمنع تعدد الميراث

  • ب

    لتهيئة فئة الاستثناء الأساسية بشكل صحيح

  • ج

    لتجاوز التتبع

  • د

    لرفع الاستثناء تلقائيًا

توضيح:

يضمن استدعاء super() تهيئة الاستثناء الأساسي بشكل صحيح مع الرسالة.

ما الذي سيتم طباعته إذا تجاوز الاستثناء المخصص __str__() وتم طباعته بالداخل باستثناء؟

  • أ

    تمثيل السلسلة التي تم تجاوزها

  • ب

    عنوان الذاكرة للاستثناء

  • ج

    اسم الفئة فقط

  • د

    لا شيء إلا إذا تم استخدام repr()

توضيح:

تستدعي print(e) __str__() لكائن الاستثناء.

الاستثناءات المعرفة من قبل المستخدم في بيثون مع أمثلةتم إكمال الاختبار بنجاح   2 /3 دقة :  0% قم بالدخول لمشاهدة الشرح 1 /3 1 /3 < Previous التالي >