Визначені користувачем винятки в Python із прикладами

Визначені користувачем винятки в Python із прикладами

Визначені користувачем винятки створюються шляхом визначення нового класу, який успадковується Вбудований виняток Python клас або один із його підкласів. Роблячи це, ми можемо створювати власні повідомлення про помилки та обробляти конкретні помилки у спосіб, який є доречним для нашої програми.

Кроки для створення та використання визначених користувачем винятків

Виконайте такі кроки, щоб створити та використовувати визначені користувачем винятки в Python:

  • Визначте новий клас винятків: Створіть новий клас, який успадковує Exception або будь-який з його підкласів.
  • Підніміть виняток: Використовуйте інструкцію raise, щоб викликати визначений користувачем виняток, коли виникає певна умова.
  • Обробка винятку: Використовуйте блоки 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 перехоплює виняток і друкує повідомлення про помилку.

Налаштування класів винятків

Коли ми створюємо спеціальний виняток, ми створюємо підклас вбудованого класу винятків 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 як кортеж.
  • Виняток перехоплюється, і відображаються його збережені аргументи.

Приклад із реального світу: помилка недійсної електронної пошти

Ось простий приклад, у якому ми створюємо спеціальний виняток, якщо електронна адреса недійсна:

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).
  • Надання більш чітких і описових повідомлень про помилки.
  • Окрема обробка групи пов’язаних помилок за допомогою винятку.

Завдяки використанню визначених користувачем винятків програми стають більш читабельними, зручними для обслуговування та легшими для налагодження.

Запропонована вікторина Редагувати вікторину 3 запитання

Що станеться, якщо визначений користувачем виняток успадкує від RuntimeError замість Exception?

  • А

    Його неможливо зловити за допомогою крім

  • Б

    Це стає неперевіреним винятком

  • C

    Обробники сприймають це як помилку, пов’язану з виконанням

  • Д

    Він втрачає власні атрибути

Пояснення:

Успадкування від RuntimeError дозволяє обробляти її як помилку під час виконання, а також як настроювану.

Чому super().__init__(self.msg) зазвичай використовується в спеціальних класах винятків?

  • А

    Щоб запобігти множинному успадкуванню

  • Б

    Щоб правильно ініціалізувати базовий клас винятків

  • C

    Щоб перевизначити зворотне відстеження

  • Д

    Для автоматичного виклику винятку

Пояснення:

Виклик super() забезпечує правильну ініціалізацію основного винятку разом із повідомленням.

Що буде надруковано, якщо спеціальний виняток замінить __str__() і буде надруковано всередині крім?

  • А

    Перевизначене представлення рядка

  • Б

    Адреса пам'яті винятку

  • C

    Тільки назва класу

  • Д

    Нічого, якщо не використовується repr().

Пояснення:

print(e) викликає __str__() об’єкта винятку.

Визначені користувачем винятки в Python із прикладамиВікторина виконана успішно. Ваш результат:   2 /3 Точність:  0% Увійдіть, щоб переглянути пояснення 1 /3 1 /3 < Previous Далі >