Изузеци су моћан и грациозан начин руковања грешкама у вашим Питхон програмима. Прилагођени изузеци подижу ову моћ на нови ниво.
Питхон-ове уграђене класе изузетака не решавају одређене ситуације грешке које се могу појавити у вашем коду. У таквим случајевима, мораћете да креирате прилагођене изузетке да бисте ефикасно решавали ове грешке.
У Питхон-у можете дефинисати прилагођене изузетке и подићи их када се појаве одређене грешке. Можете да управљате специфичним, информативним грешкама помоћу прилагођених изузетака, побољшавајући читљивост и могућност одржавања кода.
Зашто су вам потребни прилагођени изузеци?
Током развоја апликације, могу се појавити различити сценарији грешака због промена у коду, интеграције са другим пакетима или библиотекама и интеракције са спољним апликацијама. Од кључне је важности да се носите са овим грешкама да бисте се опоравили од њих или елегантно решили неуспех.
Питхон нуди низ уграђени изузетак класе које покривају грешке као нпр ВалуеЕррор, ТипеЕррор, ФилеНотФоундЕррор
, и још. Иако ови уграђени изузеци добро служе својој сврси, они само понекад могу тачно да представљају грешке које се могу појавити у вашој апликацији.Креирањем прилагођених изузетака, можете их посебно прилагодити захтевима ваше апликације и пружити информације програмерима који користе ваш код.
Како дефинисати прилагођене изузетке
Да бисте направили прилагођене изузетке, дефинише Питхон класу који наслеђује од Изузетак класа. Тхе Изузетак цласс нуди основну функционалност која ће вам требати да обрађујете изузетке, а можете је прилагодити да бисте додали функције на основу ваших специфичних потреба.
Када креирате прилагођене класе изузетака, одржавајте их једноставним, укључујући неопходне атрибуте за чување информација о грешци. Руковаоци изузецима тада могу приступити овим атрибутима да би правилно поступали са грешкама.
Ево прилагођене класе изузетака, МиЦустомЕррор:
classMyCustomError(Exception):
def__init__(self, message=None):
self.message = message
super().__init__(message)
Ова класа прихвата опциони аргумент поруке током иницијализације. Користи се супер() метод за позивање конструктора базе Изузетак класе, што је неопходно за руковање изузетцима.
Како подићи прилагођене изузетке
Да бисте покренули грешку, користите подићи кључна реч праћена инстанцом ваше прилагођене класе изузетка, прослеђујући јој поруку о грешци као аргумент:
ifTrue:
raise MyCustomError("A Custom Error Was Raised...")
Такође можете подићи грешку без прослеђивања аргумената:
ifTrue:
raise MyCustomError # shorthand
Било који формат је погодан за откривање прилагођених грешака.
Како поступати са прилагођеним изузецима
Руковање прилагођеним изузецима следи исти приступ као руковање уграђеним изузецима. Користите покушати, осим, и коначно блокове за хватање прилагођених изузетака и предузимање одговарајућих радњи.
try:
print("Hello, You're learning how to MakeUseOf Custom Errors")
raise MyCustomError("Opps, Something Went Wrong...")
except MyCustomError as err:
print(f"Error: {err}")
finally:
print("Done Handling Custom Error")
На овај начин можете руковати свим облицима подигнутих прилагођених изузетака.
Ако дође до изузетка током извршења а покушати блок, одговарајући осим блок може да га ухвати и рукује. Ако нема одговарајућег осим блок за руковање изузетком, било који коначно блок ће се извршити, након чега ће уследити поновно подизање изузетка. Користи коначно блок првенствено за обављање задатака чишћења који се морају покренути у свим околностима, без обзира да ли се догоди изузетак или не.
try:
raise KeyboardInterrupt
except MyCustomError as err:
print(f"Error: {err}")
finally:
print("Did not Handle the KeyboardInterrupt Error. \
Can Only Handle MyCustomError")
У овом узорку, а КеибоардИнтеррупт дешава се изузетак, али осим блок само ручке МиЦустомЕррор изузеци. У овом случају, коначно блок се покреће, а затим се необрађени изузетак поново покреће.
Наслеђивање прилагођених класа грешака
Базира на концепт објектно-оријентисаног програмирања (ООП), такође можете наследити од прилагођених класа изузетака, баш као и обичне класе. Наслеђивањем од прилагођене класе изузетка, можете креирати класе грешака које пружају специфичнији контекст изузетку. Овај приступ вам омогућава да рукујете грешкама на различитим нивоима у вашем коду и пружа боље разумевање шта је изазвало грешку.
Рецимо да развијате веб апликацију која је у интеракцији са спољним АПИ-јем. Овај АПИ може имати различите сценарије грешке. Овим грешкама ћете желети да рукујете доследно и јасно у целом коду. Да бисте то постигли, креирајте прилагођену класу изузетака, БасеАПИЕкцептион:
classBaseAPIException(Exception):
Base class for API-related exceptions.
def__init__(self, message):
super().__init__(message)
self.message = message
Када имате ову основну прилагођену класу изузетака, можете креирати подређене класе изузетака које наслеђују од ње:
classAPINotFoundError(BaseAPIException):
Raised when the requested resource is not found in the API.
passclassAPIAuthenticationError(BaseAPIException):
Raised when there's an issue with authentication to the API.
pass
classAPIRateLimitExceeded(BaseAPIException):
Raised when the rate limit for API requests is exceeded.
pass
Подигните и ухватите ове прилагођене изузетке када упућујете позиве АПИ-ју у оквиру ваше веб апликације. Рукујте њима у складу са тим користећи одговарајућу логику у вашем коду.
defrequest_api():
try:
# Simulate an API error for demonstration purposes
raise APINotFoundError("Requested resource not found.")
except APINotFoundError as err:
# Log or handle the 'Not Found' error case
print(f"API Not Found Error: {err}")
except APIAuthenticationError:
# Take appropriate actions for authentication error
print(f"API Authentication Error: {err}")
except APIRateLimitExceeded:
# Handle the rate limit exceeded scenario
print(f"API Rate Limit Exceeded: {err}")
except BaseAPIException:
# Handle other unknown API exceptions
print(f"Unknown API Exception: {err}")
Коначна клаузула осим проверава у односу на родитељску класу и делује као свеобухватно за све друге грешке везане за АПИ.
Када наследите прилагођене класе изузетака, можете ефикасно да рукујете грешкама унутар АПИ-ја. Овај приступ вам омогућава да одвојите руковање грешкама од детаља имплементације АПИ-ја, олакшавајући додавање прилагођених изузетака или уношење промена како се АПИ развија или наилази на нову грешку случајевима.
Паковање прилагођених изузетака
Обмотати изузетке значи ухватити изузетак, инкапсулирати га унутар прилагођеног изузетка, а затим подићи тај прилагођени изузетак док се позива на оригинални изузетак као његов узрок. Ова техника помаже у пружању контекста порукама о грешци и држи детаље имплементације скривеним од позивног кода.
Размотрите сценарио у коме ваша веб апликација ступа у интеракцију са АПИ-јем. Ако АПИ подиже а ЛоокупЕррор, можете га ухватити, па подићи обичај АПИНотФоундЕррор изузетак који наводи грешку ЛоокупЕррор као свој узрок:
defrequest_api():
try:
# Simulate an API error for demonstration purposes
# Assuming the external API raised a LookupError
raise LookupError("Sorry, You Encountered A LookUpError !!!")
except LookupError as original_exception:
try:
# Wrap the original exception with a custom exception
raise APINotFoundError \
("Requested resource not found.") from original_exception
except APINotFoundError as wrapped_exception:
# Handle the wrapped exception here
print(f"Caught wrapped API exception: {wrapped_exception}")# or re-raise it if necessary
raise
try:
request_api()
except APINotFoundError as err:
print(f"Caught API exception: {err.__cause__}")
Користи из клаузула са подићи изјаву за референцу на оригинални изузетак у оквиру вашег прилагођеног изузетка.
Када дође до прилагођеног изузетка, он укључује оригинални изузетак као а __узрок__ атрибут, пружајући везу између прилагођеног изузетка и оригинала. Ово вам омогућава да пратите порекло изузетка.
Умотавањем изузетака можете да обезбедите смисленији контекст и пошаљете прикладније поруке о грешци корисницима, без откривања детаља унутрашње примене вашег кода или АПИ-ја. Такође вам омогућава да управљате и решавате типове грешака на структурисан и уједначен начин.
Прилагођавање понашања класе у Питхон-у
Наслеђивањем основне класе изузетака коју Питхон пружа, можете креирати једноставне и корисне изузетке које можете подићи када се појаве одређене грешке у вашем коду. Такође можете имплементирати прилагођено понашање за своје класе изузетака уз помоћ магичних или дундер метода.