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