Python 3 - obsługa wyjątków

Python zapewnia dwie bardzo ważne funkcje do obsługi wszelkich nieoczekiwanych błędów w programach w języku Python i dodawania do nich funkcji debugowania -

  • Exception Handling- Będzie to omówione w tym samouczku. Oto lista standardowych wyjątków dostępnych w Pythonie - Wyjątki standardowe .

  • Assertions- Zostanie to omówione w samouczku Assertions in Python 3 .

Standardowe wyjątki

Oto lista wyjątków standardowych dostępnych w Pythonie. -

Sr.No. Nazwa i opis wyjątku
1

Exception

Klasa podstawowa dla wszystkich wyjątków

2

StopIteration

Wywoływane, gdy metoda next () iteratora nie wskazuje na żaden obiekt.

3

SystemExit

Wywołane przez funkcję sys.exit ().

4

StandardError

Klasa bazowa dla wszystkich wbudowanych wyjątków z wyjątkiem StopIteration i SystemExit.

5

ArithmeticError

Klasa bazowa dla wszystkich błędów występujących w obliczeniach numerycznych.

6

OverflowError

Podnoszone, gdy obliczenie przekracza maksymalny limit dla typu liczbowego.

7

FloatingPointError

Podnoszone, gdy obliczenia zmiennoprzecinkowe nie powiodły się.

8

ZeroDivisonError

Podnoszony, gdy dla wszystkich typów liczbowych ma miejsce dzielenie lub modulo przez zero.

9

AssertionError

Podniesione w przypadku niepowodzenia instrukcji Assert.

10

AttributeError

Podnoszone w przypadku niepowodzenia odniesienia do atrybutu lub przypisania.

11

EOFError

Wywoływane, gdy nie ma danych wejściowych z funkcji raw_input () lub input () i osiągnięto koniec pliku.

12

ImportError

Wywoływane, gdy instrukcja importu nie powiedzie się.

13

KeyboardInterrupt

Wywoływane, gdy użytkownik przerwie wykonywanie programu, zwykle naciskając Ctrl + c.

14

LookupError

Klasa bazowa dla wszystkich błędów wyszukiwania.

15

IndexError

Podnoszone, gdy indeks nie zostanie znaleziony w sekwencji.

16

KeyError

Wywoływane, gdy określony klucz nie zostanie znaleziony w słowniku.

17

NameError

Wywoływane, gdy identyfikator nie zostanie znaleziony w lokalnej lub globalnej przestrzeni nazw.

18

UnboundLocalError

Wywoływane podczas próby uzyskania dostępu do zmiennej lokalnej w funkcji lub metodzie, ale nie została do niej przypisana żadna wartość.

19

EnvironmentError

Klasa podstawowa dla wszystkich wyjątków, które występują poza środowiskiem Pythona.

20

IOError

Wywoływane, gdy operacja wejścia / wyjścia nie powiedzie się, na przykład instrukcja print lub funkcja open () podczas próby otwarcia pliku, który nie istnieje.

21

OSError

Zgłaszane z powodu błędów związanych z systemem operacyjnym.

22

SyntaxError

Wywoływane, gdy występuje błąd w składni Pythona.

23

IndentationError

Wywoływane, gdy wcięcie nie jest poprawnie określone.

24

SystemError

Wywoływane, gdy interpreter napotka wewnętrzny problem, ale po napotkaniu tego błędu interpreter Pythona nie kończy pracy.

25

SystemExit

Wywoływane, gdy interpreter Pythona jest zamykany za pomocą funkcji sys.exit (). Jeśli nie jest obsługiwany w kodzie, powoduje zakończenie pracy interpretera.

26

TypeError

Wywoływane, gdy podjęto próbę wykonania operacji lub funkcji, która jest nieprawidłowa dla określonego typu danych.

27

ValueError

Wywoływane, gdy funkcja wbudowana dla typu danych ma prawidłowy typ argumentów, ale argumenty mają określone nieprawidłowe wartości.

28

RuntimeError

Wywoływane, gdy wygenerowany błąd nie należy do żadnej kategorii.

29

NotImplementedError

Wywoływane, gdy metoda abstrakcyjna, która musi zostać zaimplementowana w klasie dziedziczonej, nie jest faktycznie zaimplementowana.

Asercje w Pythonie

Asercja to sprawdzenie poczytalności, które możesz włączyć lub wyłączyć po zakończeniu testowania programu.

  • Najłatwiejszym sposobem myślenia o asercji jest porównanie go do a raise-if(a dokładniej mówiąc, podnieś, jeśli nie). Wyrażenie jest testowane i jeśli wynik okaże się fałszywy, zgłaszany jest wyjątek.

  • Asercje są wykonywane przez instrukcję assert, najnowsze słowo kluczowe języka Python, wprowadzone w wersji 1.5.

  • Programiści często umieszczają potwierdzenia na początku funkcji, aby sprawdzić poprawność danych wejściowych, i po wywołaniu funkcji, aby sprawdzić poprawne dane wyjściowe.

Oświadczenie assert

Kiedy napotyka instrukcję assert, Python ocenia towarzyszące jej wyrażenie, które, miejmy nadzieję, jest prawdą. Jeśli wyrażenie jest fałszywe, Python zgłasza wyjątek AssertionError .

Składnia assert to -

assert Expression[, Arguments]

Jeśli asercja się nie powiedzie, Python używa ArgumentExpression jako argumentu dla AssertionError. Wyjątki AssertionError można przechwytywać i obsługiwać jak każdy inny wyjątek, używając instrukcji try-except. Jeśli nie zostaną obsłużone, zakończą działanie programu i utworzą śledzenie.

Przykład

Oto funkcja, która przekształca zadaną temperaturę ze stopni Kelvina na stopnie Fahrenheita. Ponieważ 0 ° K jest tak zimne, jak to tylko możliwe, funkcja wyskakuje, jeśli zauważy ujemną temperaturę -

#!/usr/bin/python3

def KelvinToFahrenheit(Temperature):
   assert (Temperature >= 0),"Colder than absolute zero!"
   return ((Temperature-273)*1.8)+32

print (KelvinToFahrenheit(273))
print (int(KelvinToFahrenheit(505.78)))
print (KelvinToFahrenheit(-5))

Wykonanie powyższego kodu daje następujący wynik -

32.0
451
Traceback (most recent call last):
File "test.py", line 9, in <module>
print KelvinToFahrenheit(-5)
File "test.py", line 4, in KelvinToFahrenheit
assert (Temperature >= 0),"Colder than absolute zero!"
AssertionError: Colder than absolute zero!

Co to jest wyjątek?

Wyjątkiem jest zdarzenie, które występuje podczas wykonywania programu, które zakłóca normalny przepływ instrukcji programu. Ogólnie rzecz biorąc, gdy skrypt Pythona napotyka sytuację, z którą nie może sobie poradzić, zgłasza wyjątek. Wyjątkiem jest obiekt Pythona, który reprezentuje błąd.

Kiedy skrypt Pythona zgłasza wyjątek, musi albo natychmiast obsłużyć wyjątek, w przeciwnym razie kończy działanie i kończy pracę.

Obsługa wyjątku

Jeśli masz podejrzany kod, który może wywołać wyjątek, możesz chronić swój program, umieszczając podejrzany kod w plikutry:blok. Po wykonaniu try: block dołącz plikexcept: instrukcja, po której następuje blok kodu, który rozwiązuje problem tak elegancko, jak to tylko możliwe.

Składnia

Oto prosta składnia try .... z wyjątkiem bloków ... else -

try:
   You do your operations here
   ......................
except ExceptionI:
   If there is ExceptionI, then execute this block.
except ExceptionII:
   If there is ExceptionII, then execute this block.
   ......................
else:
   If there is no exception then execute this block.

Oto kilka ważnych punktów dotyczących wyżej wymienionej składni -

  • Pojedyncza instrukcja try może mieć wiele instrukcji oprócz. Jest to przydatne, gdy blok try zawiera instrukcje, które mogą generować różne typy wyjątków.

  • Możesz również podać ogólną klauzulę except, która obsługuje każdy wyjątek.

  • Po klauzuli (-ach) else można dołączyć klauzulę else. Kod w bloku else jest wykonywany, jeśli kod w bloku try: nie zgłosi wyjątku.

  • Blok else to dobre miejsce na kod, który nie potrzebuje ochrony try: block.

Przykład

Ten przykład otwiera plik, zapisuje zawartość w pliku i wychodzi z wdziękiem, ponieważ nie ma żadnego problemu -

#!/usr/bin/python3

try:
   fh = open("testfile", "w")
   fh.write("This is my test file for exception handling!!")
except IOError:
   print ("Error: can\'t find file or read data")
else:
   print ("Written content in the file successfully")
   fh.close()

Daje to następujący wynik -

Written content in the file successfully

Przykład

Ten przykład próbuje otworzyć plik, w którym nie masz uprawnień do zapisu, więc zgłasza wyjątek -

#!/usr/bin/python3

try:
   fh = open("testfile", "r")
   fh.write("This is my test file for exception handling!!")
except IOError:
   print ("Error: can\'t find file or read data")
else:
   print ("Written content in the file successfully")

Daje to następujący wynik -

Error: can't find file or read data

Klauzula wyjątkiem bez wyjątków

Możesz również użyć instrukcji except bez wyjątków zdefiniowanych w następujący sposób -

try:
   You do your operations here
   ......................
except:
   If there is any exception, then execute this block.
   ......................
else:
   If there is no exception then execute this block.

Ten rodzaj try-exceptinstrukcja przechwytuje wszystkie wyjątki, które występują. Używanie tego rodzaju instrukcji try-except nie jest jednak uważane za dobrą praktykę programistyczną, ponieważ wyłapuje wszystkie wyjątki, ale nie powoduje, że programiści identyfikują główną przyczynę problemu, który może wystąpić.

Klauzula except z wieloma wyjątkami

Możesz również użyć tej samej instrukcji except do obsługi wielu wyjątków w następujący sposób -

try:
   You do your operations here
   ......................
except(Exception1[, Exception2[,...ExceptionN]]]):
   If there is any exception from the given exception list, 
   then execute this block.
   ......................
else:
   If there is no exception then execute this block.

Klauzula próby ostatecznej

Możesz użyć finally: blok wraz z try:blok. Plikfinally:blok to miejsce, w którym można umieścić dowolny kod, który musi zostać wykonany, niezależnie od tego, czy blok try-block wywołał wyjątek, czy nie. Składnia instrukcji try-last jest następująca -

try:
   You do your operations here;
   ......................
   Due to any exception, this may be skipped.
finally:
   This would always be executed.
   ......................

Note- Możesz podać klauzulę (y) z wyjątkiem lub klauzulę końcową, ale nie obie. Nie możesz używać klauzuli else razem z klauzulą ​​last.

Przykład

#!/usr/bin/python3

try:
   fh = open("testfile", "w")
   fh.write("This is my test file for exception handling!!")
finally:
   print ("Error: can\'t find file or read data")
   fh.close()

Jeśli nie masz uprawnień do otwierania pliku w trybie do zapisu, da to następujący wynik -

Error: can't find file or read data

Ten sam przykład można zapisać jaśniej w następujący sposób -

#!/usr/bin/python3

try:
   fh = open("testfile", "w")
   try:
      fh.write("This is my test file for exception handling!!")
   finally:
      print ("Going to close the file")
      fh.close()
except IOError:
   print ("Error: can\'t find file or read data")

Daje to następujący wynik -

Going to close the file

Gdy wyjątek zostanie zgłoszony w bloku try , wykonanie natychmiast przechodzi do ostatniego bloku. Po wszystkie oświadczenia w końcu bloku są wykonywane, wyjątek jest ponownie podniesione i jest obsługiwana w wyjątkiem oświadczenia, jeżeli występuje w następnej warstwy wyższej w try-oprócz oświadczenia.

Argument wyjątku

Wyjątek może mieć argument , który jest wartością dostarczającą dodatkowych informacji o problemie. Zawartość argumentu różni się w zależności od wyjątku. Przechwytujesz argument wyjątku, podając zmienną w klauzuli except w następujący sposób -

try:
   You do your operations here
   ......................
except ExceptionType as Argument:
   You can print value of Argument here...

Jeśli napiszesz kod obsługujący pojedynczy wyjątek, możesz mieć zmienną po nazwie wyjątku w instrukcji except. W przypadku zalewkowania wielu wyjątków za krotką wyjątku może podążać zmienna.

Ta zmienna otrzymuje wartość wyjątku zawierającego głównie przyczynę wyjątku. Zmienna może otrzymać jedną wartość lub wiele wartości w postaci krotki. Ta krotka zwykle zawiera ciąg błędu, numer błędu i lokalizację błędu.

Przykład

Poniżej znajduje się przykład pojedynczego wyjątku -

#!/usr/bin/python3

# Define a function here.
def temp_convert(var):
   try:
      return int(var)
   except ValueError as Argument:
      print ("The argument does not contain numbers\n", Argument)

# Call above function here.
temp_convert("xyz")

Daje to następujący wynik -

The argument does not contain numbers
invalid literal for int() with base 10: 'xyz'

Zgłaszanie wyjątku

Możesz zgłosić wyjątki na kilka sposobów, używając instrukcji raise. Ogólna składnia dlaraise oświadczenie jest następujące -

Składnia

raise [Exception [, args [, traceback]]]

Tutaj Exception jest typem wyjątku (na przykład NameError), a argument jest wartością dla argumentu wyjątku. Argument jest opcjonalny; jeśli nie zostanie podany, argument wyjątku to Brak.

Ostatni argument, traceback, jest również opcjonalny (i rzadko używany w praktyce), a jeśli jest obecny, jest obiektem śledzenia używanym dla wyjątku.

Przykład

Wyjątkiem może być ciąg znaków, klasa lub obiekt. Większość wyjątków wywoływanych przez rdzeń języka Python to klasy z argumentem będącym instancją klasy. Definiowanie nowych wyjątków jest dość łatwe i można to zrobić w następujący sposób -

def functionName( level ):
   if level <1:
      raise Exception(level)
      # The code below to this would not be executed
      # if we raise the exception
   return level

Note- Aby złapać wyjątek, klauzula „oprócz” musi odnosić się do tego samego wyjątku, który został zgłoszony jako obiekt klasy lub jako prosty ciąg. Na przykład, aby uchwycić powyższy wyjątek, musimy napisać klauzulę except w następujący sposób -

try:
   Business Logic here...
except Exception as e:
   Exception handling here using e.args...
else:
   Rest of the code here...

Poniższy przykład ilustruje użycie zgłaszania wyjątku -

#!/usr/bin/python3

def functionName( level ):
   if level <1:
      raise Exception(level)
      # The code below to this would not be executed
      # if we raise the exception
   return level

try:
   l = functionName(-10)
   print ("level = ",l)
except Exception as e:
   print ("error in level argument",e.args[0])

Spowoduje to następujący wynik

error in level argument -10

Wyjątki zdefiniowane przez użytkownika

Python umożliwia również tworzenie własnych wyjątków poprzez wyprowadzanie klas ze standardowych wbudowanych wyjątków.

Oto przykład związany z RuntimeError . Tutaj tworzona jest klasa, która jest podklasą z RuntimeError . Jest to przydatne, gdy chcesz wyświetlić bardziej szczegółowe informacje, gdy zostanie przechwycony wyjątek.

W bloku try wyjątek zdefiniowany przez użytkownika jest zgłaszany i przechwytywany w bloku except. Zmienna e służy do tworzenia instancji klasy Networkerror .

class Networkerror(RuntimeError):
   def __init__(self, arg):
      self.args = arg

Więc po zdefiniowaniu powyższej klasy możesz zgłosić wyjątek w następujący sposób -

try:
   raise Networkerror("Bad hostname")
except Networkerror,e:
   print e.args