Python - 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: Standardowe wyjątki .

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

Lista standardowych wyjątków -

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

ZeroDivisionError

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

9

AssertionError

Podniesione w przypadku niepowodzenia instrukcji Assert.

10

AttributeError

Wywoływane 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

IOError

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ć poprawność danych wyjściowych.

Assert komunikat

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 .

Plik syntax bo twierdzenie jest -

assert Expression[, Arguments]

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

Przykład

Oto funkcja, która konwertuje temperaturę ze stopni Kelvina na stopnie Fahrenheita. Ponieważ zero stopni Kelvina jest tak zimne, jak to tylko możliwe, funkcja wyskakuje, jeśli zauważy ujemną temperaturę -

#!/usr/bin/python
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, kiedy 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/python

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/python

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

Wyjątkiem Klauzula 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ć.

Wyjątkiem Clause z wielu wyjątków

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. Ostatni blok to miejsce, w którym można umieścić dowolny kod, który musi zostać wykonany, niezależnie od tego, czy blok try zgłosił 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.
   ......................

Nie możesz używać klauzuli else razem z klauzulą ​​last.

Przykład

#!/usr/bin/python

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"

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/python

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"

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, 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/python

# Define a function here.
def temp_convert(var):
   try:
      return int(var)
   except ValueError, 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'

Podnoszenie wyjątków

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ń Pythona 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 "Invalid level!", level
      # The code below to this would not be executed
      # if we raise the exception

Note:Aby złapać wyjątek, klauzula „oprócz” musi odwoływać się do tego samego zgłoszonego wyjątku, albo obiektu klasy, albo prostego ciągu. Na przykład, aby przechwycić powyższy wyjątek, musimy napisać klauzulę except w następujący sposób -

try:
   Business Logic here...
except "Invalid level!":
   Exception handling here...
else:
   Rest of the code here...

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

Kiedy już zdefiniowałeś powyższą klasę, możesz zgłosić wyjątek w następujący sposób -

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