logo

Wyjątki zdefiniowane przez użytkownika w Pythonie z przykładami

Wyjątki zdefiniowane przez użytkownika są tworzone poprzez zdefiniowanie nowej klasy, z której dziedziczy Wbudowany wyjątek Pythona klasa lub jedna z jej podklas. W ten sposób możemy tworzyć niestandardowe komunikaty o błędach i obsługiwać określone błędy w sposób, który ma sens dla naszej aplikacji.

Kroki tworzenia i używania wyjątków zdefiniowanych przez użytkownika

Wykonaj poniższe kroki, aby utworzyć i używać wyjątków zdefiniowanych przez użytkownika w Pythonie:



  • Zdefiniuj nową klasę wyjątku: Utwórz nową klasę, która dziedziczy po wyjątku lub dowolnej z jego podklas.
  • Podnieś wyjątek: Użyj instrukcji raise, aby zgłosić wyjątek zdefiniowany przez użytkownika, gdy wystąpi określony warunek.
  • Obsługuj wyjątek: Użyj bloków try-except do obsługi wyjątku zdefiniowanego przez użytkownika.

Przykład: W tym przykładzie tworzymy niestandardowy wyjątek InvalidAgeError, aby mieć pewność, że wartości wieku mieszczą się w prawidłowym zakresie (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) 

Wyjście
150 -> Age must be between 0 and 120 

Wyjaśnienie:

wilk lub lis
  • Klasa InvalidAgeError dziedziczy po wyjątku. Definiuje __gorący__ metoda akceptowania wieku i przesłania.
  • Metoda __str__ zwraca czytelną reprezentację błędu w postaci ciągu.
  • W set_age() jeśli wiek wykracza poza prawidłowy zakres (0–120), zgłaszany jest wyjątek.
  • Blok try-except przechwytuje wyjątek i wyświetla komunikat o błędzie.

Dostosowywanie klas wyjątków

Kiedy tworzymy niestandardowy wyjątek, podklasujemy wbudowaną w Pythonie klasę wyjątkowych (lub podklasę, taką jak ValueError TypeError itp.). Następnie możemy dodać własne metody atrybutów lub niestandardową logikę, aby nasz wyjątek był bardziej informacyjny.



Możemy także ulepszyć niestandardowe wyjątki, dodając dodatkowe atrybuty lub zastępując metody.

Przykład: Tutaj ulepszamy InvalidAgeError, dodając kod błędu i dostosowując komunikat o błędzie.

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) 

Wyjście
[Error Code 1001] 150 -> Age must be between 0 and 120 

Wyjaśnienie:



  • InvalidAgeError ma teraz dodatkowy atrybut error_code.
  • Metoda __str__ została zastąpiona, aby wyświetlić zarówno kod błędu, jak i wiek.
  • Po wykonaniu set_age(150) zgłaszany jest wyjątek i przechwytywany w bloku try-except.
  • Drukowany jest dostosowany komunikat o błędzie, dzięki czemu błąd jest bardziej opisowy.

Używanie wyjątków standardowych jako klasy bazowej

Czasami zamiast bezpośrednio dziedziczyć po wyjątku, możemy utworzyć niestandardowy wyjątek, podklasując standardowy wyjątek, taki jak RuntimeError ValueError itp. Jest to przydatne, gdy niestandardowy wyjątek powinien być traktowany jako określony rodzaj błędu.

Przykład: Ten przykład pokazuje, jak utworzyć niestandardowy wyjątek NetworkError, dziedzicząc z RuntimeError, który jest standardowym wbudowanym wyjątkiem.

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) 

Wyjście
('Connection failed') 

Wyjaśnienie:

  • NetworkError dziedziczy po RuntimeError, który jest wbudowanym typem wyjątku.
  • Po wywołaniu wiadomość jest przechowywana w atrybucie args jako krotka.
  • Wyjątek zostanie przechwycony i wyświetlone zostaną zapisane w nim argumenty.

Przykład z życia wziętego: nieprawidłowy błąd e-maila

Oto prosty przykład, w którym zgłaszamy niestandardowy wyjątek, jeśli adres e-mail jest nieprawidłowy:

mapa vs zestaw
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) 

Wyjście
userexample.com -> Invalid email format 

Wyjaśnienie:

  • Zdefiniowano nową klasę wyjątku InvalidEmailError w celu sprawdzania poprawności adresów e-mail.
  • Jeśli podany adres e-mail nie zawiera znaku „@”, zgłaszany jest wyjątek.
  • Blok try-except przechwytuje błąd i drukuje sformatowany komunikat.

Kiedy używać wyjątków zdefiniowanych przez użytkownika?

Wyjątki zdefiniowane przez użytkownika należy uwzględnić w następujących scenariuszach:

  • Reprezentowanie określonych błędów w aplikacji (np. InvalidAgeError DatabaseConnectionError).
  • Zapewnianie jaśniejszych i bardziej opisowych komunikatów o błędach.
  • Oddzielna obsługa grupy powiązanych błędów przy użyciu z wyjątkiem.

Dzięki zastosowaniu wyjątków zdefiniowanych przez użytkownika programy stają się bardziej czytelne, łatwiejsze w utrzymaniu i łatwiejsze do debugowania.