10 běžných typů chyb Pythonu a jak je vyřešit

Jako programátor se při vývoji softwaru musíte setkat s chybami. To se může pohybovat od chyb ve vaší logice vedoucí k neočekávaným výsledkům, chyb vyplývajících z porušení pravidel programovacího jazyka, až po chyby, které vznikají při spouštění vašeho programu a mnoho dalších. Tyto chyby se běžně označují jako chyby.

Chyby jsou všudypřítomné v každém programovacím jazyce bez ohledu na to, jak snadné je naučit se jazyk nebo jej používat.

Například v Pythonu, ačkoli jazyk klade důraz na čitelnost, dodržuje expresivní syntaxi a je považován za relativně snadno se naučit a používat ve srovnání s jinými programovacími jazyky, stále nejste imunní vůči programovacím chybám při používání Pythonu.

Vzhledem k tomu, že chyby nutně vznikají, je dobrým způsobem, jak se s nimi vypořádat, dozvědět se o různých typech chyb, které se mohou vyskytnout, ao tom, jak k nim dochází. To vám umožní vyhnout se nebo minimalizovat tyto chyby při programování a také vědět, jak s nimi zacházet, když nastanou.

Zde jsou některé z běžných chyb Pythonu, se kterými se můžete setkat při programování pomocí jazyka:

SyntaxErrors

Chyba syntaxe je chyba, která vzniká při psaní kódu, který porušuje pravidla programovacího jazyka, který používáte. Výsledkem je neplatný řádek kódu.

Například v Pythonu, když tisknete řetězec, je třeba jej vložit do uvozovek. Pokud tak neučiníte, dojde k chybě syntaxe.

Chyba syntaxe může také nastat, když zapomenete otevřít nebo zavřít závorky, hranaté závorky nebo složené závorky, překlepnete klíčová slova nebo názvy funkcí, vynecháte dvojtečky na konci příkazů řízení toku nebo když vynecháte požadované operátory ve výrazech.

Obecně k chybám v syntaxi dojde, pokud porušíte pravidlo o tom, jak by se měl psát kód Pythonu.

## 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 spuštění výše uvedeného kódu se zobrazí chybová zpráva, jak je uvedeno níže:

Chybová zpráva při spuštění kódu je následující:

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

Chcete-li tyto chyby vyřešit, použijte správnou syntaxi Pythonu, jak je uvedeno níže:

print("Hello World")

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

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

IndentationError

Na rozdíl od jiných jazyků jako Java, C nebo C++, které k oddělení bloků kódu používají složené závorky, Python používá k definování hierarchie a struktury bloků kódu odsazení. Například při psaní řídicích příkazů v Javě je veškerý kód, který má být proveden po vyhodnocení podmínky, obsažen ve složených závorkách.

V Pythonu však bude blok kódu odsazen. Typické odsazení v Pythonu se skládá ze čtyř mezer nebo jednoho tabulátoru. Na počtu mezer však nezáleží, pokud zůstane konzistentní v celém zapisovaném kódu.

Jako programátor Pythonu se pravděpodobně setkáte s chybami v odsazení, když se vám nepodaří přidat požadované odsazení, například při psaní řídicích příkazů nebo funkcí, když k vytvoření odsazení použijete tabulátor i mezery, protože to mate interpreta, když vložíte odsazení. na nesprávném místě nebo když vaše odsazení nejsou konzistentní v celé vaší kódové základně.

  Jak můžete změnit svůj e-mail na PS4

Níže je uveden příklad kódu, který vede k chybě odsazení:

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

Chybové zprávy vyplývající z výše uvedeného kódu jsou uvedeny níže:

Chybová zpráva při spuštění kódu je následující:

  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

Chcete-li opravit chyby, je vyžadováno odsazení řádku za příkazem if jako odsazení a ujistěte se, že odpovídá odsazení ve zbytku kódu, jak je uvedeno níže:

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

TypeError

V Pythonu je TypeError výjimka, která nastane, když se pokusíte provést operaci pomocí nekompatibilního datového typu. Pokud se například pokusíte přidat řetězec a celé číslo nebo zřetězit datový typ řetězec s celým číslem, objeví se chyba TypeError.

S TypeErrors se také můžete setkat, když používáte funkce nebo metody s nesprávnými datovými typy, když se pokoušíte použít neceločíselný index pro přístup k položkám v iterovatelném seznamu, jako je seznam, nebo když se pokoušíte iterovat objektem, který nelze iterovat.

Obecně platí, že jakákoli operace používající nesprávný datový typ povede k chybě TypeError.

Níže jsou uvedeny příklady operací, které mohou vést k chybám 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"])

Chybové zprávy vyplývající z výše uvedeného kódu jsou uvedeny níže:

Ukázková zpráva TypeError z kódu je uvedena níže:

  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

Chcete-li odstranit chyby, použijte správné typy dat nebo převody typů, jak je uvedeno níže:

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])

AttributeError

V Pythonu se chyba AttributeError objeví, když se pokusíte použít atribut, který na objektu neexistuje, nebo zavoláte metodu, která na objektu, na který je volán, neexistuje. AttributeError ukazuje, že objekt nemá atribut nebo metodu, která je na něm volána.

Pokud například zavoláte metodu řetězce na celé číslo, narazíte na AttributeError, protože metoda neexistuje pro typ objektu, na kterém ji voláte.

V níže uvedeném příkladu je metoda capitalize(), která se používá k převodu prvního písmene řetězce na velká písmena, volána na celé číslo. Výsledkem je chyba atributu, protože int nemá metodu capitalize().

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

Spuštění tohoto kódu má za následek chybovou zprávu uvedenou níže:

Zpráva AttributeError z kódu je následující:

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

Chcete-li vyřešit chybu AttributeError, ujistěte se, že metoda nebo atribut, který voláte, existuje na typu objektu, na který ji voláte. V tomto případě tuto chybu vyřeší volání capitalize() na datovém typu řetězce, jak je uvedeno níže:

ImportError

Chyba importu v Pythonu nastane, když se pokusíte importovat modul, který nelze najít nebo není dostupný ve vašem aktuálním prostředí. Je možné, že ještě není nainstalován, nemáte správně nakonfigurovanou jeho cestu nebo jste zadali chybně modul, který se pokoušíte nainstalovat.

  Proč Adobe Shockwave neustále padá?

Chyba ImportError má jednu podtřídu s názvem ModuleNotFoundError, což je chyba, která je vyvolána při pokusu o import modulu, který nelze najít.

Například níže uvedený kód se pokouší importovat knihovnu analýzy dat pandas vyvolá takovou chybu, protože modul ještě není nainstalován.

Vygenerovaná zpráva ImportError je zobrazena níže:

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

Chcete-li takovou chybu vyřešit, ujistěte se, že jsou nainstalovány moduly, které se pokoušíte importovat. V případě, že to chybu nevyřeší, zkontrolujte, zda používáte správný pravopis pro modul a správnou cestu k souboru pro přístup k modulu.

ValueError

Toto je výjimka, která nastane, když funkce v Pythonu obdrží hodnotu správného datového typu, ale hodnota je nevhodná. Například funkce Math.sqrt() použitá k nalezení druhé odmocniny číselných hodnot vrátí hodnotu ValueError, pokud zadáte záporné číslo.

Jakkoli bude hodnota správného typu, tedy číselné hodnoty, záporná hodnota z ní činí nevhodnou hodnotu pro

Funkce int(), která převádí číslo nebo řetězec, vrátí hodnotu ValueError, pokud zadáte řetězec, který není číselnou hodnotou řetězce. Předání „123“ nebo „45“ funkci nevrátí žádnou chybu, protože řetězce lze převést na příslušnou celočíselnou hodnotu.

Pokud však zadáte řetězec, který není číselnou hodnotou řetězce, jako je „Ahoj“, vrátí hodnotu ValueError. Důvodem je, že „Ahoj“, ačkoliv je řetězec, je nevhodný, protože nemá celočíselný ekvivalent.

Níže je uveden příklad kódu, který generuje hodnotu ValueError:

# 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)

Chyby z výše uvedeného kódu jsou uvedeny níže:

Vygenerovaná chybová zpráva je následující:

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

Chcete-li chybu opravit, použijte příslušné hodnoty ve funkcích, jak je uvedeno níže:

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

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

IOError

IOError (Input/Output Error) je výjimka, která nastane, když selže vstupní nebo výstupní operace. Může to být způsobeno pokusem o přístup k neexistujícímu souboru, nedostatečným úložištěm na disku ve vašem zařízení, pokusem o přístup k souboru, ke kterému nemáte dostatečná oprávnění, nebo při pokusu o přístup k souboru, který je právě používán jinými operacemi.

Takovou chybu pravděpodobně způsobí metody jako open(), read(), write() a close(), které se obvykle používají při práci se soubory.

Zvažte níže uvedený kód, který se pokouší otevřít soubor s názvem „notes.txt“, který neexistuje. Výsledkem kódu je IOError, která vyvolá FileNotFoundError:

S následující chybovou zprávou:

  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'

Abyste předešli výše uvedené chybě, vše, co musíte udělat, je zajistit, aby v adresáři, ve kterém spouštíte terminál, existuje soubor „notes.txt“. Dalším způsobem, jak zpracovat IOErrors, je použití bloku pokusu mimo, jak je uvedeno níže:

NameError

NameError je výjimka, se kterou se setkáte, když se pokusíte použít proměnnou, funkci nebo modul, který neexistuje, není definován v aktuálním oboru nebo jí nebyla přiřazena hodnota.

K takové chybě obvykle dochází, když špatně napíšete názvy proměnných nebo funkcí nebo je použijete před jejich definováním. Použití modulu bez jeho importu bude mít také za následek NameError.

  Mobilní ad hoc síť (MANET) [+3 Learning Resources]

Následující kód bude mít za následek výjimku 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

Z výše uvedeného kódu vyplývají následující chybové zprávy:

Ukázková zpráva NameError je zobrazena níže:

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

Chcete-li takovou chybu NameError vyřešit, ujistěte se, že nepoužíváte moduly, než je importujete, že nepoužíváte proměnné nebo funkce, než je definujete, a že neděláte překlepy v názvech funkcí nebo proměnných:

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

y = 23
print(y)

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

IndexError

Chyba IndexError je výjimka, ke které dochází při pokusu o přístup k indexu v seznamu nebo n-tici, který je mimo rozsah. Zvažte níže uvedený seznam:

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

Seznam má pět prvků. Python počítá indexy od 0 (nula). Proto má výše uvedený seznam indexy v rozsahu od 0 do n-1, přičemž n je číslo nebo prvky v seznamu. V tomto případě bude index nebo seznam v rozsahu od 0 do 4.

Pokud se pokusíte o přístup k prvku s indexem větším než 4, narazíte na chybu IndexError, protože index je mimo rozsah v seznamu, ze kterého se pokoušíte přistupovat k prvku. Níže uvedený kód generuje IndexError:

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

Chyba z kódu je zobrazena níže:

Vygenerovaná zpráva IndexError je následující:

  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

Nejlepším způsobem, jak se vyhnout chybě IndexError, je využít funkce range() a len(), abyste zajistili, že budete přistupovat pouze k prvkům, které jsou v dosahu, jako je tento:

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

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

KeyError

KeyError je výjimka, ke které dochází, když se pokusíte o přístup k položce ze slovníku pomocí klíče a klíč není ve slovníku nalezen. Zvažte níže uvedený slovník:

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

Klíče ve slovníku jsou „Kanada“, „USA“, „Itálie“. K položkám ze slovníku měst se dostanete pomocí tří kláves. Pokud se však pokusíte o přístup k prvku pomocí klíče, který neexistuje, jako je „Brazílie“, narazíte na chybu KeyError, jak je uvedeno níže:

Vygenerovaná zpráva KeyError je zobrazena níže:

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

Chcete-li vyřešit chybu KeyError, ujistěte se, že klíče, které používáte pro přístup k prvkům ve slovníku, jsou ve slovníku skutečně přítomny. Chcete-li to provést, můžete použít následující prohlášení:

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")

Tímto způsobem se vyhnete narážkám na KeyErrors při přístupu k prvkům ze slovníku

Závěr

Při kódování v Pythonu se bez ohledu na úroveň vaší odbornosti nutně setkáte s chybami. Nezapomeňte se proto seznámit s různými typy chyb zvýrazněnými v článku, abyste měli jistotu, že je budete schopni řešit, když nastanou.

Můžete také prozkoumat některé užitečné Python jednolinky pro zjednodušení běžných úkolů.