10 typowych typów błędów Pythona i sposoby ich rozwiązywania

Jako programista na pewno napotkasz błędy podczas tworzenia oprogramowania. Może to obejmować błędy w twojej logice prowadzące do nieoczekiwanych wyników, błędy wynikające z naruszenia zasad języka programowania, a nawet błędy, które pojawiają się podczas uruchamiania twojego programu, i wiele innych. Błędy te są powszechnie nazywane błędami.

Błędy są wszechobecne w każdym języku programowania, niezależnie od tego, jak łatwo jest się go nauczyć lub używać.

Na przykład w Pythonie, chociaż język kładzie nacisk na czytelność, ma ekspresywną składnię i jest uważany za stosunkowo łatwy do nauczenia się i używania w porównaniu z innymi językami programowania, nadal nie jesteś odporny na błędy programistyczne podczas korzystania z Pythona.

Ponieważ błędy są nieuniknione, dobrym sposobem radzenia sobie z nimi jest zapoznanie się z różnymi typami błędów, które mogą się pojawić, i sposobami ich powstawania. Pozwala to uniknąć lub zminimalizować te błędy podczas programowania, a także wiedzieć, jak sobie z nimi poradzić, gdy się pojawią.

Oto niektóre typowe błędy Pythona, które możesz napotkać podczas programowania w tym języku:

Błędy składni

Błąd składni to błąd, który pojawia się, gdy piszesz kod, który narusza zasady języka programowania, którego używasz. Powoduje to nieprawidłowy wiersz kodu.

Na przykład w Pythonie podczas drukowania ciągu należy go umieścić w cudzysłowie. Niezastosowanie się do tego spowoduje błąd składni.

Błąd składniowy może również powstać w przypadku pominięcia nawiasów otwierających lub zamykających, nawiasów kwadratowych lub nawiasów klamrowych, błędnej pisowni słów kluczowych lub nazw funkcji, pominięcia dwukropków na końcu instrukcji kontroli przepływu lub pominięcia wymaganych operatorów w wyrażeniach.

Ogólnie rzecz biorąc, błędy składniowe pojawią się, jeśli naruszysz zasadę dotyczącą tego, jak należy pisać kod w Pythonie.

## syntax error arising from missing quotation mark
## around the string being printed
print("Hello World)

age = 20
## Syntax error arising from missing colon in an if statement
if age > 18
    print("Age is over 18")

## Syntax error because '(' was never closed
def square(x:
    return x * x
print(square(4))

Po uruchomieniu powyższego kodu pojawi się komunikat o błędzie, jak pokazano poniżej:

Komunikat o błędzie podczas uruchamiania kodu jest następujący:

  File "/home/madici/Desktop/helloworld.py", line 1
    print("Hello World)
          ^
SyntaxError: unterminated string literal (detected at line 1)

Aby rozwiązać te błędy, użyj właściwej składni Pythona, jak pokazano poniżej:

print("Hello World")

age = 20
if age > 18:
    print("Age is over 18")

def square(x):
    return x * x
print(square(4))

Błąd wcięcia

W przeciwieństwie do innych języków, takich jak Java, C lub C++, które używają nawiasów klamrowych do oddzielania bloków kodu, Python używa wcięć do definiowania hierarchii i struktury bloków kodu. Na przykład podczas pisania instrukcji sterujących w Javie cały kod, który ma zostać wykonany po ocenie warunku, jest zawarty w nawiasach klamrowych.

Jednak w Pythonie blok kodu zostanie wcięty. Typowe wcięcie w Pythonie składa się z czterech spacji lub jednej tabulacji. Jednak liczba spacji nie ma znaczenia, o ile pozostaje spójna w całym pisanym kodzie.

Jako programista Pythona możesz napotkać błędy wcięcia, gdy nie dodasz wymaganego wcięcia, na przykład podczas pisania instrukcji sterujących lub funkcji, gdy używasz zarówno tabulacji, jak i spacji do tworzenia wcięć, ponieważ dezorientuje to tłumacza, gdy umieszczasz wcięcia w niewłaściwym miejscu lub gdy wcięcia nie są spójne w całej bazie kodu.

Poniżej przedstawiono przykład kodu powodującego błąd wcięcia:

age = 20
if age > 18:
print("Age is greater than 18")
   print("You're allowed to drive")
else:
    print("Age is less than 18")

Komunikaty o błędach wynikające z powyższego kodu przedstawiono poniżej:

Komunikat o błędzie podczas uruchamiania kodu jest następujący:

  File "/home/madici/Desktop/helloworld.py", line 3
    print("Age is greater than 18")
    ^
IndentationError: expected an indented block after 'if' statement on line 2

Aby poprawić błędy, wprowadź wcięcie wiersza po instrukcji if jako wymaganego wcięcia i upewnij się, że odpowiada ono wcięciu w pozostałej części kodu, jak pokazano poniżej:

age = 20
if age > 18:
   print("Age is greater than 18")
   print("You're allowed to drive")
else:
   print("Age is less than 18")

Błąd typu

W Pythonie TypeError to wyjątek, który pojawia się, gdy próbujesz wykonać operację przy użyciu niezgodnego typu danych. Na przykład, jeśli spróbujesz dodać łańcuch znaków i liczbę całkowitą lub połączyć ciąg znaków z liczbą całkowitą, napotkasz błąd TypeError.

Błędy typu można również napotkać, gdy używasz funkcji lub metod z niepoprawnymi typami danych, gdy próbujesz użyć indeksu niecałkowitego, aby uzyskać dostęp do elementów w iterowalnym, takim jak lista, lub gdy próbujesz iterować przez obiekt, który nie może być iterowalny.

Ogólnie rzecz biorąc, każda operacja używająca nieprawidłowego typu danych doprowadzi do błędu TypeError.

Poniżej przedstawiono przykłady operacji, które mogą prowadzić do błędów typu:

# Type Error resulting from concatenating a string an an integer
age = 25
message = "I am " + age + " years old."


list1 = [1, "hello", 5, "world", 18, 2021]
#Type errors resulting from wrong usage of builtin in methods
print(sum(list1))

#TypeError resulting from adding a string and an integer
num1 = 10
num2 = "16"
print(num1 + num2)

#TypeError resulting from using a non integer index
list2 = ["hello", "from", "the", "other", "side"]
print(list2["1"])

Komunikaty o błędach wynikające z powyższego kodu pokazano poniżej:

Poniżej przedstawiono przykładowy komunikat TypeError z kodu:

  File "/home/madici/Desktop/helloworld.py", line 3, in <module>
    message = "I am " + age + " years old."
              ~~~~~~~~^~~~~
TypeError: can only concatenate str (not "int") to str

Aby usunąć błędy, użyj poprawnych typów danych lub konwersji typów, jak pokazano poniżej:

age = 25
message = "I am " + str(age) + " years old."

list1 = [1, 5, 18, 2021]
print(sum(list1))

num1 = 10
num2 = "16"
print(num1 + int(num2))

list2 = ["hello", "from", "the", "other", "side"]
print(list2[1])

Błąd atrybutu

W Pythonie AttributeError występuje, gdy próbujesz użyć atrybutu, który nie istnieje w obiekcie lub wywołać metodę, która nie istnieje w obiekcie, do którego jest wywoływana. AttributeError pokazuje, że obiekt nie ma atrybutu ani metody, która jest na nim wywoływana.

Na przykład, jeśli wywołasz metodę łańcuchową na liczbie całkowitej, napotkasz AttributeError, ponieważ metoda nie istnieje na typie obiektu, dla którego ją wywołujesz.

W przykładzie pokazanym poniżej metoda kapitalizacji(), która jest używana do konwersji pierwszej litery łańcucha na wielką, jest wywoływana na liczbie całkowitej. Rezultatem jest błąd atrybutu, ponieważ int nie ma metody kapitalizacji().

# AttributeError arising from calling capitalize() on an int value
num = 1445
cap = num.capitalize()
print(cap)

Uruchomienie tego kodu powoduje wyświetlenie komunikatu o błędzie pokazanego poniżej:

Komunikat AttributeError z kodu jest następujący:

  File "/home/madici/Desktop/helloworld.py", line 3, in <module>
    cap = num.capitalize()
          ^^^^^^^^^^^^^^
AttributeError: 'int' object has no attribute 'capitalize'

Aby rozwiązać problem AttributeError, upewnij się, że wywoływana metoda lub atrybut istnieje w typie obiektu, do którego jest wywoływana. W takim przypadku wywołanie kapitalizacji() dla typu danych łańcuchowych rozwiązuje ten błąd, jak pokazano poniżej:

Importuj błąd

ImportError w Pythonie występuje, gdy próbujesz zaimportować moduł, którego nie można znaleźć lub nie jest dostępny w bieżącym środowisku. Możliwe, że nie jest jeszcze zainstalowany, nie skonfigurowałeś poprawnie jego ścieżki lub źle wpisałeś moduł, który próbujesz zainstalować.

ImportError ma pojedynczą podklasę podrzędną o nazwie ModuleNotFoundError, która jest błędem generowanym podczas próby zaimportowania modułu, którego nie można znaleźć.

Na przykład poniższy kod z próbami importu biblioteki analizy danych pandas zgłasza taki błąd, ponieważ moduł nie jest jeszcze zainstalowany.

Wygenerowany komunikat ImportError jest pokazany poniżej:

  File "/home/madici/Desktop/helloworld.py", line 1, in <module>
    import pandas
ModuleNotFoundError: No module named 'pandas'

Aby rozwiązać taki błąd, upewnij się, że moduły, które próbujesz zaimportować, zostały zainstalowane. Jeśli to nie rozwiąże problemu, sprawdź, czy używasz poprawnej pisowni dla modułu i poprawnej ścieżki do pliku, aby uzyskać dostęp do modułu.

Błąd wartości

Jest to wyjątek, który występuje, gdy funkcja w Pythonie otrzymuje wartość poprawnego typu danych, ale wartość jest niewłaściwa. Na przykład funkcja Math.sqrt() używana do znalezienia pierwiastka kwadratowego z wartości liczbowych zwróci błąd wartości, jeśli podasz liczbę ujemną.

O ile wartość będzie poprawnego typu, czyli wartości numerycznej, o tyle wartość ujemna powoduje, że jest to wartość niewłaściwa dla

Funkcja int(), która konwertuje liczbę lub ciąg znaków, zwróci błąd wartości, jeśli przekażesz ciąg, który nie jest wartością ciągu numerycznego. Przekazanie „123” lub „45” do funkcji nie zwraca błędu, ponieważ ciągi znaków można przekonwertować na odpowiednią wartość całkowitą.

Jeśli jednak przekażesz ciąg, który nie jest ciągiem liczbowym, takim jak „Hello”, zwracany jest błąd ValueError. Dzieje się tak, ponieważ „Cześć”, chociaż jest ciągiem znaków, jest nieodpowiednie, ponieważ nie ma odpowiednika w postaci liczby całkowitej.

Przykład kodu generującego błąd ValueError pokazano poniżej:

# Value error resulting from inappropriate int value in sqrt()
import math
num = -64
root = math.sqrt(num)
print(root)

# Value error resulting from passing a string with no integer
# equivalent into int() function
numString = "Hello"
num = int(numString)
print(num)

Błędy z powyższego kodu pokazano poniżej:

Wygenerowany komunikat o błędzie jest następujący:

  File "/home/madici/Desktop/helloworld.py", line 4, in <module>
    root = math.sqrt(num)
           ^^^^^^^^^^^^^^
ValueError: math domain error

Aby poprawić błąd, użyj odpowiednich wartości w funkcjach, jak pokazano poniżej:

import math
num = 64
root = math.sqrt(num)
print(root)

numString = "5231"
num = int(numString)
print(num)

IOBłąd

IOError (Input/Output Error) to wyjątek występujący w przypadku niepowodzenia operacji wejścia lub wyjścia. Może to być spowodowane próbą uzyskania dostępu do pliku, który nie istnieje, niewystarczającą ilością miejsca na dysku w urządzeniu, próbą uzyskania dostępu do pliku, do którego nie masz wystarczających uprawnień, lub próbą uzyskania dostępu do pliku, który jest aktualnie używany przez inne operacje.

Metody takie jak open(), read(), write() i close(), które są zwykle używane podczas pracy z plikami, mogą powodować taki błąd.

Rozważ poniższy kod, który próbuje otworzyć plik o nazwie „notes.txt”, który nie istnieje. Kod powoduje błąd IOError, który wywołuje błąd FileNotFoundError:

Z następującym komunikatem o błędzie:

  File "/home/madici/Desktop/helloworld.py", line 2, in <module>
    file1 = open("notes.txt", "r")
            ^^^^^^^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: 'notes.txt'

Aby uniknąć powyższego błędu, wszystko, co musisz zrobić, to upewnić się, że plik „notes.txt” istnieje w katalogu, w którym uruchamiasz terminal. Innym sposobem obsługi błędów IOErrors jest użycie bloku try except, jak pokazano poniżej:

NazwaBłąd

NameError to wyjątek, który napotkasz podczas próby użycia zmiennej, funkcji lub modułu, który nie istnieje, nie jest zdefiniowany w bieżącym zakresie lub nie ma przypisanej wartości.

Taki błąd zwykle występuje, gdy błędnie wpisujesz nazwy zmiennych lub funkcji lub używasz ich przed ich zdefiniowaniem. Użycie modułu bez importowania spowoduje również błąd nazwy.

Poniższy kod spowoduje wyjątek NameError:

# name error arises because the math module has not been imported
num = 64
root = math.sqrt(64)
print(root)

# NameError arises because x is used before it is defined
y = 23
print(x)

#NameEror because function name is not defined
def greet():
    print("Good morning")
great() #ameError: name 'great' is not defined

Poniższe komunikaty o błędach wynikają z powyższego kodu:

Przykładowy komunikat NameError jest pokazany poniżej:

  File "/home/madici/Desktop/helloworld.py", line 3, in <module>
    root = math.sqrt(64)
           ^^^^
NameError: name 'math' is not defined

Aby rozwiązać taki błąd nazwy, upewnij się, że nie używasz modułów przed ich zaimportowaniem, nie używasz zmiennych ani funkcji przed ich zdefiniowaniem i nie popełniasz błędów w pisowni nazw funkcji lub zmiennych:

import math
num = 64
root = math.sqrt(64)
print(root)

y = 23
print(y)

def greet():
    print("Good morning")
greet()

Błąd indeksu

IndexError to wyjątek, który występuje, gdy próbujesz uzyskać dostęp do indeksu na liście lub krotce, która jest poza zakresem. Rozważ poniższą listę:

list1 = [1, 2, 3, 4, 5]

Lista zawiera pięć elementów. Python liczy indeksy od 0 (zero). Dlatego powyższa lista ma indeksy od 0 do n-1, gdzie n jest liczbą lub elementami na liście. W takim przypadku indeks lub lista będą miały zakres od 0 do 4.

Jeśli spróbujesz uzyskać dostęp do elementu o indeksie większym niż 4, napotkasz błąd IndexError, ponieważ indeks jest poza zakresem na liście, z której próbujesz uzyskać dostęp do elementu. Poniższy kod generuje błąd IndexError:

list1 = [1, 2, 3, 4, 5]
item = list1[6] #IndexError because the list index is out of range
print(item)

Błąd z kodu pokazano poniżej:

Wygenerowany komunikat IndexError jest następujący:

  File "/home/madici/Desktop/helloworld.py", line 2, in <module>
    item = list1[6] #IndexError because the list index is out of range
           ~~~~~^^^
IndexError: list index out of range

Najlepszym sposobem na uniknięcie błędu IndexError jest użycie funkcji range() i len(), aby upewnić się, że uzyskujesz dostęp tylko do elementów, które znajdują się w takim zakresie:

list1 = [1, 2, 3, 4, 5]

for i in range(len(list1)):
    print(list1[i])

Błąd klucza

KeyError to wyjątek, który występuje, gdy próbujesz uzyskać dostęp do elementu ze słownika za pomocą klucza, a klucza nie można znaleźć w słowniku. Rozważ poniższy słownik:

cities = {"Canada": "Ottawa", "USA": "Washington", "Italy": "Rome"}

Klucze w słowniku to „Kanada”, „USA”, „Włochy”. Możesz uzyskać dostęp do pozycji ze słownika miast za pomocą trzech klawiszy. Jeśli jednak spróbujesz uzyskać dostęp do elementu za pomocą klucza, który nie istnieje, na przykład „Brazylia”, napotkasz błąd klucza, jak pokazano poniżej:

Wygenerowany komunikat KeyError jest pokazany poniżej:

  File "/home/madici/Desktop/helloworld.py", line 6, in <module>
    print(cities["Brazil"])
          ~~~~~~^^^^^^^^^^
KeyError: 'Brazil'

Aby rozwiązać problem KeyError, upewnij się, że klucze, których używasz do uzyskiwania dostępu do elementów w słowniku, rzeczywiście znajdują się w słowniku. Aby to zrobić, możesz użyć instrukcji if…else w następujący sposób:

cities = {"Canada": "Ottawa", "USA": "Washington", "Italy": "Rome"}

country = "Canada"

if country in cities:
    print("The capital city of " + country + " is " + cities[country])
else:
	print("The key " + country + " is not present in the cities dictionary")

W ten sposób unikniesz błędów KeyErrors podczas uzyskiwania dostępu do elementów ze słownika

Wniosek

Podczas kodowania w Pythonie, niezależnie od poziomu wiedzy, na pewno napotkasz błędy. Dlatego zapoznaj się z różnymi typami błędów opisanymi w artykule, aby mieć pewność, że będziesz w stanie sobie z nimi poradzić, gdy się pojawią.

Możesz także zapoznać się z kilkoma przydatnymi jednowierszami Pythona, aby uprościć typowe zadania.