חריגים המוגדרים על ידי משתמש ב- Python עם דוגמאות

חריגים המוגדרים על ידי משתמש ב- Python עם דוגמאות

חריגים המוגדרים על ידי משתמש נוצרים על ידי הגדרת מחלקה חדשה שיורשת ממנה החריגה המובנית של Python מחלקה או אחת מתתי המחלקות שלה. על ידי כך נוכל ליצור הודעות שגיאה מותאמות אישית ולטפל בשגיאות ספציפיות בצורה הגיונית עבור היישום שלנו.

שלבים ליצירה ושימוש בחריגים בהגדרת משתמש

בצע את השלבים הבאים כדי ליצור ולהשתמש בחריגים בהגדרת משתמש ב-Python:

  • הגדר מחלקת חריגה חדשה: צור מחלקה חדשה שיורשת מ-Exception או מכל תת-מחלקות שלה.
  • העלה את החריג: השתמש בהצהרת העלאה כדי להעלות את החריג המוגדר על ידי המשתמש כאשר מתרחש מצב ספציפי.
  • טפל בחריג: השתמש בלוקים של try-except כדי לטפל בחריג המוגדר על ידי המשתמש.

דוּגמָה: בדוגמה זו אנו יוצרים חריג מותאם אישית 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 יורשת מ-Exception. זה מגדיר א __חַם__ שיטה לקבל גיל ומסר.
  • השיטה __str__ מחזירה ייצוג מחרוזת קריא של השגיאה.
  • ב-set_age() אם הגיל נמצא מחוץ לטווח החוקי (0-120), החריג מועלה.
  • הבלוק try-except תופס את החריג ומדפיס את הודעת השגיאה.

התאמה אישית של שיעורי חריגים

כאשר אנו יוצרים חריג מותאם אישית, אנו מחלקים משנה את מחלקת ה-Exception המובנית של 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) מבוצע, החריג מועלה ונתפס בבלוק try-except.
  • הודעת השגיאה המותאמת אישית מודפסת מה שהופך את השגיאה לתיאורית יותר.

שימוש בחריגים סטנדרטיים כמחלקת בסיס

לפעמים במקום לרשת ישירות מ-Exception, אנו יכולים ליצור חריג מותאם אישית על-ידי סיווג משנה של חריג סטנדרטי כגון 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 כ-tuple.
  • החריג נתפס והארגומנטים המאוחסנים שלו מוצגים.

דוגמה בעולם האמיתי: שגיאת אימייל לא חוקית

הנה דוגמה פשוטה שבה אנו מעלים חריג מותאם אישית אם כתובת האימייל אינה חוקית:

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 מוגדרת לאימות כתובות דוא"ל.
  • אם האימייל הנתון אינו מכיל '@', החריג מועלה.
  • הבלוק try-except תופס את השגיאה ומדפיס את ההודעה המעוצבת.

מתי להשתמש בחריגים בהגדרת משתמש?

יש לשקול חריגים המוגדרים על ידי המשתמש בתרחישים הבאים:

  • מייצג שגיאות ספציפיות באפליקציה (למשל InvalidAgeError DatabaseConnectionError).
  • מתן הודעות שגיאה ברורות ותיאוריות יותר.
  • טיפול בקבוצה של שגיאות קשורות בנפרד באמצעות except.

על ידי שימוש בחריגים המוגדרים על ידי המשתמש הופכות תוכניות לקריאה יותר ניתנות לתחזוקה וקלות יותר לניפוי באגים.

חידון מוצע חידון ערוך 3 שאלות

מה קורה אם חריג המוגדר על ידי המשתמש יורש מ-RuntimeError במקום מ-Exception?

  • א

    אי אפשר לתפוס אותו באמצעות אלא

  • ב

    זה הופך לחריג לא מסומן

  • ג

    המטפלים מתייחסים אליו כשגיאה הקשורה לזמן ריצה

  • ד

    הוא מאבד תכונות מותאמות אישית

הֶסבֵּר:

ירושה מ-RuntimeError מאפשרת לטפל בה כשגיאת זמן ריצה כמו גם כשגיאה מותאמת אישית.

מדוע נעשה שימוש נפוץ בסופר().__init__(self.msg) במחלקות חריגות מותאמות אישית?

  • א

    כדי למנוע ירושה מרובה

  • ב

    כדי לאתחל כראוי את מחלקת החריג הבסיסית

  • ג

    כדי לעקוף את העקיבה

  • ד

    כדי להעלות אוטומטית את החריג

הֶסבֵּר:

קריאה ל- super() מבטיחה שהחריג הבסיסי מאותחל כהלכה עם ההודעה.

מה יודפס אם חריגה מותאמת אישית עוקפת את __str__() ומודפסת בפנים מלבד?

  • א

    ייצוג המחרוזת שנדחק

  • ב

    כתובת הזיכרון של החריג

  • ג

    רק שם הכיתה

  • ד

    שום דבר אלא אם כן נעשה שימוש ב-repr().

הֶסבֵּר:

print(e) קורא ל-__str__() של אובייקט החריגה.

חריגים המוגדרים על ידי משתמש ב- Python עם דוגמאותהחידון הסתיים בהצלחה הציון שלך:   2 /3 דיוק:  0% התחבר כדי להציג הסבר 1 /3 1 /3 < Previous הבא >