Изключенията са мощен и елегантен начин за обработка на грешки във вашите програми на Python. Персонализираните изключения извеждат тази сила на ново ниво.

Вградените класове изключения на Python не адресират определени ситуации на грешка, които могат да възникнат във вашия код. В такива случаи ще трябва да създадете персонализирани изключения, за да се справите ефективно с тези грешки.

В Python можете да дефинирате персонализирани изключения и да ги повдигате, когато възникнат конкретни ситуации на грешка. Можете да управлявате конкретни, информативни грешки с персонализирани изключения, подобрявайки четливостта и поддръжката на вашия код.

Защо са ви необходими персонализирани изключения?

По време на разработката на приложение могат да възникнат различни сценарии за грешка поради промени в кода, интеграция с други пакети или библиотеки и взаимодействия с външни приложения. От решаващо значение е да се справите с тези грешки, за да се възстановите от тях или да се справите с повредата елегантно.

instagram viewer

Python предлага набор от вградено изключение класове, които покриват грешки като ValueError, TypeError, FileNotFoundError, и още. Въпреки че тези вградени изключения служат добре на предназначението си, те могат само понякога да представят точно грешките, които могат да възникнат във вашето приложение.

Като създавате персонализирани изключения, можете да ги приспособите специално, за да отговарят на изискванията на вашето приложение и да предоставите информация за разработчиците, които използват вашия код.

Как да дефинирате персонализирани изключения

За да създадете персонализирани изключения, дефинирайте клас Python който наследява от Клас изключение. The Изключение предлага базова функционалност, от която ще се нуждаете, за да обработвате изключения, и можете да го персонализирате, за да добавите функции въз основа на вашите специфични нужди.

Когато създавате персонализирани класове изключения, поддържайте ги прости, като същевременно включвате необходимите атрибути за съхраняване на информация за грешка. След това манипулаторите на изключения могат да имат достъп до тези атрибути, за да обработват правилно грешките.

Ето персонализиран клас изключения, MyCustomError:

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

По този начин можете да обработвате всички форми на персонализирани изключения.

Ако възникне изключение по време на изпълнение на a опитвам блок, съответстващ с изключение блок може да го хване и да го обработва. Ако няма подходящо с изключение блок за обработка на изключението, произволен накрая блок ще се изпълни, последвано от повторно повдигане на изключението. Използвай накрая блокира основно за извършване на задачи за почистване, които трябва да се изпълняват при всякакви обстоятелства, независимо дали възникне изключение или не.

try:
raise KeyboardInterrupt
except MyCustomError as err:
print(f"Error: {err}")
finally:
print("Did not Handle the KeyboardInterrupt Error. \
Can Only Handle MyCustomError")

В тази проба, a KeyboardInterrupt възниква изключение, но с изключение блок само дръжки MyCustomError изключения. В този случай, накрая блок се изпълнява и след това необработеното изключение се повдига отново.

Наследяване на персонализирани класове грешки

Базиран на концепция за обектно-ориентирано програмиране (OOP), можете също да наследявате от персонализирани класове изключения, точно както обикновените класове. Като наследите от персонализиран клас изключение, можете да създадете класове грешки, които предоставят по-специфичен контекст на изключение. Този подход ви позволява да обработвате грешки на различни нива във вашия код и осигурява по-добро разбиране на причините за грешката.

Да кажем, че разработвате уеб приложение, което взаимодейства с външен API. Този API може да има различни сценарии за грешка. Ще искате да обработвате тези грешки последователно и ясно във вашия код. За да постигнете това, създайте персонализиран клас изключения, BaseAPIException:

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.
pass

classAPIAuthenticationError(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

Повишете и уловете тези персонализирани изключения, когато правите извиквания към API във вашето уеб приложение. Обработете ги съответно, като използвате подходящата логика във вашия код.

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}")

Последната клауза за изключение проверява спрямо родителския клас и действа като улов за всички други грешки, свързани с API.

Когато наследите персонализирани класове изключения, можете ефективно да обработвате грешки в API. Този подход ви позволява да отделите вашата обработка на грешки от подробностите за внедряването на API, което улеснява добавянето на персонализирани изключения или извършването на промени, когато API се развива или среща нова грешка случаи.

Обвиване на персонализирани изключения

Обвиването на изключения означава да се хване изключение, да се капсулира в персонализирано изключение и след това да се повдигне това персонализирано изключение, като се посочва оригиналното изключение като негова причина. Тази техника помага да се предостави контекст на съобщенията за грешка и запазва подробностите за изпълнението скрити от извикващия код.

Помислете за сценария, при който вашето уеб приложение взаимодейства с API. Ако API повдигне a LookupError, можете да го хванете, след това вдигнете обичай APINotFoundError изключение, което препраща към LookupError като причина:

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__}")

Използвай от клауза с повишавам израз за препратка към оригиналното изключение във вашето персонализирано изключение.

Когато възникне персонализираното изключение, то включва оригиналното изключение като a __причина__ атрибут, осигуряващ връзка между персонализираното изключение и оригинала. Това ви позволява да проследите произхода на изключение.

Чрез опаковане на изключения можете да предоставите по-смислен контекст и да изпратите по-подходящи съобщения за грешка до потребителите, без да разкривате подробности за вътрешната реализация на вашия код или API. Освен това ви позволява да управлявате и адресирате типове грешки по структуриран и единен начин.

Персонализиране на поведението на класа в Python

Като наследите базовия клас изключения, който Python предоставя, можете да създадете прости и полезни изключения, които можете да повдигнете, когато възникнат специфични грешки във вашия код. Можете също така да приложите персонализирано поведение за вашите класове изключения с помощта на магически или dunder методи.