Jak tworzyć niestandardowe wyjątki w Pythonie

Jak tworzyć niestandardowe wyjątki w Pythonie
Czytelnicy tacy jak Ty pomagają wspierać MUO. Kiedy dokonujesz zakupu za pomocą linków na naszej stronie, możemy otrzymać prowizję partnerską. Czytaj więcej.

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.





MUO Film dnia PRZEWIŃ, ABY KONTYNUOWAĆ TREŚĆ

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?

  przyznaj się do swojego błędu

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 :

 class MyCustomError(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:

 if True: 
    raise MyCustomError("A Custom Error Was Raised!!!.")

Możesz także zgłosić błąd bez przekazywania żadnych argumentów:

 if True: 
    raise MyCustomError # shorthand

Każdy format jest odpowiedni do zgłaszania błędów niestandardowych.

  zgłosił błąd niestandardowy

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.

skąd wiesz, czy Twój facebook został zhakowany
 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.

  obsługa błędu niestandardowego

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.

  Ślad stosu pokazujący nieobsługiwany wyjątek

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 :

 class BaseAPIException(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ą:

 class APINotFoundError(BaseAPIException): 
    """Raised when the requested resource is not found in the API."""
    pass

class APIAuthenticationError(BaseAPIException):
    """Raised when there's an issue with authentication to the API."""
    pass

class APIRateLimitExceeded(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.

 def request_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.

  dziedziczenie wyjątku niestandardowego

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 interfejsu API, co ułatwia dodawanie niestandardowych wyjątków lub wprowadzanie zmian w miarę ewolucji interfejsu API lub napotykania nowych przypadków błędów.

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:

 def request_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.

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

dlaczego mój telefon ładuje się wolno?

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.