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