Кориснички дефинисани изузеци у Питхон-у са примерима

Кориснички дефинисани изузеци у Питхон-у са примерима

Кориснички дефинисани изузеци се креирају дефинисањем нове класе која наслеђује од Питхон-ов уграђени изузетак класе или једне од њених поткласа. На тај начин можемо креирати прилагођене поруке о грешци и поступати са специфичним грешкама на начин који има смисла за нашу апликацију.

Кораци за креирање и коришћење кориснички дефинисаних изузетака

Пратите ове кораке да бисте креирали и користили кориснички дефинисане изузетке у Питхон-у:

  • Дефинишите нову класу изузетака: Креирајте нову класу која наслеђује Екцептион или било коју од његових подкласа.
  • Подигните изузетак: Користите наредбу подизања да бисте подигли кориснички дефинисани изузетак када се појави одређени услов.
  • Обрадите изузетак: Користите блокове три-екцепт за руковање кориснички дефинисаним изузетком.

Пример: У овом примеру креирамо прилагођени изузетак ИнвалидАгеЕррор да бисмо осигурали да вредности узраста спадају у важећи опсег (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  

Објашњење:

  • ИнвалидАгеЕррор класа наслеђује од Екцептион. Он дефинише ан __вруће__ метод прихватања старости и поруке.
  • Метода __стр__ враћа читљив стринг приказ грешке.
  • У сет_аге() ако је старост изван важећег опсега (0–120) изузетак се подиже.
  • Блок три-екцепт хвата изузетак и штампа поруку о грешци.

Прилагођавање класа изузетака

Када креирамо прилагођени изузетак, ми подкласирамо Питхон-ову уграђену класу Екцептион (или подкласу као што је ВалуеЕррор ТипеЕррор итд.). Затим можемо додати сопствене методе атрибута или прилагођену логику како бисмо наш изузетак учинили информативнијим.

Такође можемо да побољшамо прилагођене изузетке додавањем додатних атрибута или замењивањем метода.

Пример: Овде побољшавамо грешку ИнвалидАгеЕррор додавањем кода грешке и прилагођавањем поруке о грешци.

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  

Објашњење:

  • ИнвалидАгеЕррор сада има додатни атрибут еррор_цоде.
  • Метода __стр__ је замењена да би се приказали и код грешке и старост.
  • Када се изврши сет_аге(150), изузетак се подиже и хвата у блок три-екцепт.
  • Прилагођена порука о грешци се штампа, чинећи грешку описнијом.

Коришћење стандардних изузетака као основне класе

Понекад уместо директног наслеђивања из изузетка можемо да креирамо прилагођени изузетак тако што ћемо подкласирати стандардни изузетак као што је РунтимеЕррор ВалуеЕррор итд. Ово је корисно када ваш прилагођени изузетак треба третирати као специфичну врсту грешке.

Пример: Овај пример показује како да креирате прилагођени изузетак НетворкЕррор наслеђивањем од РунтимеЕррор који је стандардни уграђени изузетак.

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')  

Објашњење:

  • НетворкЕррор наслеђује РунтимеЕррор који је уграђени тип изузетка.
  • Када се подигне, порука се чува у атрибуту аргс као тупле.
  • Изузетак је ухваћен и његови сачувани аргументи се приказују.

Пример из стварног света: неважећа грешка е-поште

Ево једноставног примера где покрећемо прилагођени изузетак ако адреса е-поште није важећа:

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  

Објашњење:

  • Нова класа изузетка ИнвалидЕмаилЕррор је дефинисана за валидацију адреса е-поште.
  • Ако дати имејл не садржи '@', подиже се изузетак.
  • Блок три-екцепт хвата грешку и штампа форматирану поруку.

Када користити кориснички дефинисане изузетке?

Кориснички дефинисане изузетке треба узети у обзир у следећим сценаријима:

  • Представљање одређених грешака у апликацији (нпр. ИнвалидАгеЕррор ДатабасеЦоннецтионЕррор).
  • Пружање јаснијих и описнијих порука о грешци.
  • Руковање групом повезаних грешака одвојено користећи осим.

Коришћењем кориснички дефинисаних изузетака програми постају читљивији за одржавање и лакши за отклањање грешака.

Предложени квиз Уреди квиз 3 питања

Шта се дешава ако кориснички дефинисани изузетак наследи РунтимеЕррор уместо Екцептиона?

  • А

    Не може се ухватити користећи осим

  • Б

    Постаје непроверен изузетак

  • Ц

    Руковаоци га третирају као грешку у вези са извршавањем

  • Д

    Губи прилагођене атрибуте

Објашњење:

Наслеђивање од РунтимеЕррор омогућава да се третира као грешка током извршавања, као и као прилагођена.

Зашто се супер().__инит__(селф.мсг) обично користи у прилагођеним класама изузетака?

  • А

    Да би се спречило вишеструко наслеђивање

  • Б

    Да бисте правилно иницијализовали основну класу изузетака

  • Ц

    Да бисте заменили повратно праћење

  • Д

    За аутоматско подизање изузетка

Објашњење:

Позивање супер() осигурава да је основни изузетак исправно иницијализован са поруком.

Шта ће бити одштампано ако прилагођени изузетак замени __стр__() и буде одштампан унутра осим?

  • А

    Замењена репрезентација стрингова

  • Б

    Меморијска адреса изузетка

  • Ц

    Само име класе

  • Д

    Ништа осим ако се не користи репр().

Објашњење:

принт(е) позива __стр__() објекта изузетка.

Кориснички дефинисани изузеци у Питхон-у са примеримаКвиз је успешно завршен Ваш резултат:   2 /3 тачност:  0% Пријавите се да бисте видели објашњење 1 /3 1 /3 < Previous Следећи >