Wyjątki to skuteczny i elegancki sposób obsługi błędów w programach w języku Python. Niestandardowe wyjątki przenoszą tę moc na nowy poziom.
Wbudowane klasy wyjątków Pythona nie rozwiązują pewnych sytuacji związanych z błędami, które mogą pojawić się w kodzie. W takich przypadkach konieczne będzie utworzenie niestandardowych wyjątków, aby skutecznie obsługiwać te błędy.
W Pythonie możesz definiować niestandardowe wyjątki i zgłaszać je, gdy wystąpią określone błędy. Możesz zarządzać konkretnymi, informacyjnymi błędami za pomocą niestandardowych wyjątków, poprawiając czytelność i łatwość konserwacji kodu.
Dlaczego potrzebujesz niestandardowych wyjątków?
Podczas tworzenia aplikacji mogą wystąpić różne scenariusze błędów wynikające ze zmian w kodzie, integracji z innymi pakietami lub bibliotekami oraz interakcji z aplikacjami zewnętrznymi. Radzenie sobie z tymi błędami jest niezwykle istotne, aby móc je naprawić lub sprawnie poradzić sobie z awarią.
Python oferuje szereg wbudowany wyjątek klasy obejmujące błędy takie jak
Błąd wartości, TypBłąd, Błąd FileNotFound, i więcej. Chociaż te wbudowane wyjątki dobrze spełniają swoją funkcję, tylko czasami mogą dokładnie odzwierciedlać błędy, które mogą wystąpić w aplikacji.Tworząc niestandardowe wyjątki, możesz dostosować je specjalnie do wymagań Twojej aplikacji i zapewnić informacje programistom korzystającym z Twojego kodu.
Jak zdefiniować niestandardowe wyjątki
Aby utworzyć niestandardowe wyjątki, zdefiniuj klasę Pythona który dziedziczy po Klasa wyjątku. The Wyjątek class oferuje podstawową funkcjonalność potrzebną do obsługi wyjątków, ale można ją dostosować, dodając funkcje w zależności od konkretnych potrzeb.
Tworząc niestandardowe klasy wyjątków, zadbaj o ich prostotę, dołączając jednocześnie niezbędne atrybuty do przechowywania informacji o błędach. Programy obsługi wyjątków mogą następnie uzyskać dostęp do tych atrybutów, aby odpowiednio obsłużyć błędy.
Oto niestandardowa klasa wyjątków, Mój niestandardowy błąd:
classMyCustomError(Exception):
def__init__(self, message=None):
self.message = message
super().__init__(message)
Ta klasa akceptuje opcjonalny argument komunikatu podczas inicjalizacji. Używa Super() metoda wywołania konstruktora bazy Wyjątek klasa, która jest niezbędna do obsługi wyjątków.
Jak zgłosić wyjątki niestandardowe
Aby zgłosić błąd, użyj metody wznosić słowo kluczowe, po którym następuje instancja niestandardowej klasy wyjątku, przekazując mu komunikat o błędzie jako argument:
ifTrue:
raise MyCustomError("A Custom Error Was Raised...")
Możesz także zgłosić błąd bez przekazywania żadnych argumentów:
ifTrue:
raise MyCustomError # shorthand
Każdy format jest odpowiedni do zgłaszania błędów niestandardowych.
Jak obsługiwać wyjątki niestandardowe
Obsługa wyjątków niestandardowych przebiega w ten sam sposób, co obsługa wbudowanych wyjątków. Używać próbować, z wyjątkiem, I Wreszcie bloki, aby wychwycić niestandardowe wyjątki i podjąć odpowiednie działania.
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")
W ten sposób możesz obsłużyć wszystkie formy zgłoszonych niestandardowych wyjątków.
Jeżeli podczas wykonywania a próbować blok, odpowiedni z wyjątkiem blok może go złapać i obsłużyć. Jeśli nie ma odpowiedniego z wyjątkiem blok do obsługi wyjątku, dowolny Wreszcie blok zostanie wykonany, po czym nastąpi ponowne zgłoszenie wyjątku. Użyć Wreszcie block przede wszystkim do wykonywania zadań czyszczących, które muszą zostać uruchomione w każdych okolicznościach, niezależnie od tego, czy wystąpi wyjątek, czy nie.
try:
raise KeyboardInterrupt
except MyCustomError as err:
print(f"Error: {err}")
finally:
print("Did not Handle the KeyboardInterrupt Error. \
Can Only Handle MyCustomError")
W tym przykładzie a Przerwanie klawiatury występuje wyjątek, ale z wyjątkiem blokuj tylko uchwyty Mój niestandardowy błąd wyjątki. W tym przypadku Wreszcie blok zostanie uruchomiony, a następnie nieobsługiwany wyjątek zostanie ponownie zgłoszony.
Dziedziczenie niestandardowych klas błędów
Na podstawie koncepcja programowania obiektowego (OOP), możesz także dziedziczyć z niestandardowych klas wyjątków, podobnie jak zwykłe klasy. Dziedzicząc z niestandardowej klasy wyjątków, można tworzyć klasy błędów, które zapewniają bardziej szczegółowy kontekst wyjątku. Takie podejście umożliwia obsługę błędów na różnych poziomach kodu i zapewnia lepsze zrozumienie przyczyny błędu.
Załóżmy, że tworzysz aplikację internetową, która współdziała z zewnętrznym interfejsem API. Ten interfejs API może mieć różne scenariusze błędów. Będziesz chciał uporać się z tymi błędami w sposób spójny i przejrzysty w całym kodzie. Aby to osiągnąć, utwórz niestandardową klasę wyjątków, Wyjątek BaseAPIE:
classBaseAPIException(Exception):
Base class for API-related exceptions.
def__init__(self, message):
super().__init__(message)
self.message = message
Kiedy już masz tę podstawową, niestandardową klasę wyjątków, możesz utworzyć podrzędne klasy wyjątków, które po niej dziedziczą:
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
Zgłaszaj i przechwytuj te niestandardowe wyjątki podczas wykonywania wywołań interfejsu API w aplikacji internetowej. Postępuj z nimi odpowiednio, stosując odpowiednią logikę w kodzie.
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}")
Końcowa klauzula z wyjątkiem sprawdza klasę nadrzędną i działa jako wychwytująca wszelkie inne błędy związane z interfejsem API.
Dziedzicząc niestandardowe klasy wyjątków, możesz skutecznie obsługiwać błędy w interfejsie API. Takie podejście pozwala oddzielić obsługę błędów od szczegółów implementacji API, ułatwiając dodawanie niestandardowych wyjątków lub wprowadzanie zmian w miarę ewolucji interfejsu API lub napotkania nowego błędu sprawy.
Zawijanie niestandardowych wyjątków
Zawijanie wyjątków oznacza przechwycenie wyjątku, zamknięcie go w niestandardowym wyjątku, a następnie wywołanie tego niestandardowego wyjątku, odwołując się do pierwotnego wyjątku jako jego przyczyny. Ta technika pomaga zapewnić kontekst komunikatom o błędach i ukrywa szczegóły implementacji przed kodem wywołującym.
Rozważmy scenariusz, w którym aplikacja internetowa wchodzi w interakcję z interfejsem API. Jeśli interfejs API zgłasza a Błąd wyszukiwania, możesz go złapać, a następnie podnieść zwyczaj Błąd APINotFound wyjątek, który odwołuje się do błędu LookupError jako przyczyny:
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__}")
Użyć z klauzula z wznosić instrukcja odnosząca się do oryginalnego wyjątku w ramach niestandardowego wyjątku.
Gdy wystąpi wyjątek niestandardowy, uwzględnia on oryginalny wyjątek jako plik __przyczyna__ atrybut, udostępniający łącze między niestandardowym wyjątkiem a oryginałem. Dzięki temu możesz prześledzić pochodzenie wyjątku.
Zawijając wyjątki, możesz zapewnić bardziej znaczący kontekst i wysyłać użytkownikom bardziej odpowiednie komunikaty o błędach, bez ujawniania wewnętrznych szczegółów implementacji kodu lub interfejsu API. Umożliwia także zarządzanie typami błędów i eliminowanie ich w ustrukturyzowany i jednolity sposób.
Dostosowywanie zachowania klasy w Pythonie
Dziedzicząc podstawową klasę wyjątków udostępnianą przez Python, możesz tworzyć proste i przydatne wyjątki, które możesz zgłosić, gdy w kodzie wystąpią określone błędy. Możesz także zaimplementować niestandardowe zachowanie dla swoich klas wyjątków za pomocą metod magicznych lub dunder.