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

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łuż 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:

  • 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:

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.

Sugerowany quiz Edytuj quiz 3 pytania

Co się stanie, jeśli wyjątek zdefiniowany przez użytkownika odziedziczy po RuntimeError zamiast wyjątku?

  • A

    Nie można go złapać za pomocą z wyjątkiem

  • B

    Staje się niesprawdzonym wyjątkiem

  • C

    Jest to traktowane przez procedury obsługi jako błąd związany z czasem wykonania

  • D

    Traci niestandardowe atrybuty

Wyjaśnienie:

Dziedziczenie z RuntimeError pozwala na traktowanie go zarówno jako błędu wykonania, jak i błędu niestandardowego.

Dlaczego funkcja super().__init__(self.msg) jest powszechnie używana w niestandardowych klasach wyjątków?

  • A

    Aby zapobiec wielokrotnemu dziedziczeniu

  • B

    Aby poprawnie zainicjować podstawową klasę wyjątków

  • C

    Aby zastąpić metodę śledzenia

  • D

    Aby automatycznie zgłosić wyjątek

Wyjaśnienie:

Wywołanie super() gwarantuje, że wyjątek podstawowy zostanie poprawnie zainicjowany wraz z komunikatem.

Co zostanie wydrukowane, jeśli niestandardowy wyjątek zastąpi __str__() i zostanie wydrukowany wewnątrz z wyjątkiem?

  • A

    Przesłonięta reprezentacja ciągu

  • B

    Adres pamięci wyjątku

  • C

    Tylko nazwa klasy

  • D

    Nic, chyba że zostanie użyte repr().

Wyjaśnienie:

print(e) wywołuje __str__() obiektu wyjątku.

Wyjątki zdefiniowane przez użytkownika w Pythonie z przykładamiQuiz ukończony pomyślnie Twój wynik:   2 /3 Dokładność :  0% Zaloguj się, aby zobaczyć wyjaśnienie 1 /3 1 /3 < Previous Dalej >