10 tipuri comune de erori Python și cum să le rezolvi

În calitate de programator, sunteți obligat să întâmpinați erori în timpul dezvoltării software-ului. Acest lucru poate varia de la erori în logica dvs. care duc la rezultate neașteptate, erori care decurg din încălcarea regulilor unui limbaj de programare, până la erori care apar în timpul rulării programului, printre multe altele. Aceste erori sunt denumite în mod obișnuit bug-uri.

Bug-urile sunt omniprezente în fiecare limbaj de programare, indiferent de cât de ușor este să înveți sau să folosești limbajul.

În Python, de exemplu, deși limbajul accentuează lizibilitatea, urmează o sintaxă expresivă și este considerat relativ ușor de învățat și utilizat în comparație cu alte limbaje de programare, încă nu ești imun la erorile de programare când folosești Python.

Deoarece erorile sunt neapărat să apară, o modalitate bună de a le trata este să înveți despre diferitele tipuri de erori care pot apărea și cum apar. Acest lucru vă permite să evitați sau să minimizați aceste erori în timpul programării și, de asemenea, să știți cum să le gestionați atunci când apar.

Iată câteva dintre erorile comune Python pe care le puteți întâlni în timpul programarii folosind limbajul:

SyntaxErrors

O eroare de sintaxă este o eroare care apare atunci când scrieți cod care încalcă regulile limbajului de programare pe care îl utilizați. Rezultă o linie de cod nevalidă.

În Python, de exemplu, atunci când tipăriți un șir, acesta trebuie să fie pus între ghilimele. Nerespectarea acestui lucru duce la o eroare de sintaxă.

O eroare de sintaxă poate apărea și atunci când pierdeți parantezele de deschidere sau închidere, paranteze pătrate sau acolade, cuvinte cheie sau nume de funcții greșite, două puncte la sfârșitul instrucțiunilor de control al fluxului sau atunci când ratați operatorii necesari în expresii.

În general, erori de sintaxă vor apărea dacă încălcați o regulă privind modul în care ar trebui scris codul Python.

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

La rularea codului de mai sus, veți întâlni un mesaj de eroare, așa cum se arată mai jos:

Mesajul de eroare de la rularea codului este următorul:

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

Pentru a rezolva aceste erori, utilizați sintaxa Python corectă, așa cum se arată mai jos:

print("Hello World")

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

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

IndentationErrore

Spre deosebire de alte limbaje precum Java, C sau C++, care folosesc acolade pentru a separa blocurile de cod, Python folosește indentarea pentru a defini ierarhia și structura blocurilor de cod. De exemplu, atunci când scrieți instrucțiuni de control în Java, tot codul care trebuie executat odată ce condiția a fost evaluată este conținut în acolade.

În Python, totuși, blocul de cod va fi indentat. O indentare tipică în Python constă din patru spații sau o filă. Cu toate acestea, numărul de spații nu contează atâta timp cât rămâne consecvent pe tot parcursul codului care este scris.

În calitate de programator Python, este posibil să întâmpinați erori de indentare atunci când nu reușiți să adăugați indentarea necesară, cum ar fi atunci când scrieți instrucțiuni de control sau funcții, când utilizați atât tab, cât și spații pentru a crea indentări, deoarece încurcă interpretul, când puneți indentări în locul greșit sau când indentările nu sunt consecvente în întreaga bază de cod.

Un exemplu de cod care are ca rezultat o eroare de indentare este prezentat mai jos:

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

Mesajele de eroare rezultate din codul de mai sus sunt prezentate mai jos:

  Cât durează Tinder Shadowban?

Mesajul de eroare de la rularea codului este următorul:

  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

Pentru a corecta erorile, este necesară indentarea liniei după declarația if ca indentare și asigurați-vă că se potrivește cu indentarea din restul codului, așa cum se arată mai jos:

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

Eroare de scris

În Python, o TypeError este o excepție care apare atunci când încercați să efectuați o operațiune folosind un tip de date incompatibil. De exemplu, dacă încercați să adăugați un șir și un întreg sau să concatenați un tip de date șir cu un întreg, veți întâlni o TypeError.

De asemenea, puteți întâlni TypeErrors atunci când utilizați funcții sau metode cu tipuri de date incorecte, când încercați să utilizați un index neîntreger pentru a accesa elemente dintr-un iterabil, cum ar fi o listă, sau când încercați să iterați printr-un obiect care nu poate fi iterabil.

În general, orice operație care utilizează un tip de date incorect va duce la o Eroare de tip.

Exemple de operațiuni care pot duce la TypeErrors sunt prezentate mai jos:

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

Mesajele de eroare rezultate din codul de mai sus sunt prezentate mai jos:

Un exemplu de mesaj TypeError din cod este afișat mai jos:

  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

Pentru a elimina erorile, utilizați tipurile de date corecte sau conversiile de tip, așa cum se arată mai jos:

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

În Python, apare o AttributeError atunci când încercați să utilizați un atribut care nu există pe obiect sau să apelați o metodă care nu există pe obiectul pe care este apelat. O AttributeError arată că un obiect nu are un atribut sau o metodă care este apelată pe el.

De exemplu, dacă apelați o metodă șir pe un întreg, veți întâlni o AttributeError deoarece metoda nu există pe tipul de obiect pe care o apelați.

În exemplul prezentat mai jos, metoda capitalize(), care este folosită pentru a converti prima literă a unui șir în majuscule, este apelată pe un întreg. Rezultatul este o eroare de atribut deoarece int nu are metoda capitalize().

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

Rularea acestui cod are ca rezultat mesajul de eroare prezentat mai jos:

Mesajul AttributeError din cod este următorul:

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

Pentru a rezolva o AttributeError, asigurați-vă că metoda sau atributul pe care îl apelați există pe tipul de obiect pe care îl apelați. În acest caz, apelarea capitalize() pe un tip de date șir rezolvă această eroare, după cum se arată mai jos:

ImportError

ImportError în Python apare atunci când încercați să importați un modul care nu poate fi găsit sau nu este accesibil în mediul dvs. actual. Este posibil ca acesta să nu fie încă instalat, să nu i-ați configurat corect calea sau să fi scris greșit modulul pe care încercați să îl instalați.

  Cum să obțineți cea mai mare comandă DoorDash

Un ImportError are o singură subclasă copil numită ModuleNotFoundError, care este eroarea care este aruncată atunci când încercați să importați un modul care nu poate fi găsit.

De exemplu, codul de mai jos cu încercări de a importa biblioteca de analiză de date panda aruncă o astfel de eroare deoarece modulul nu este încă instalat.

Mesajul ImportError generat este afișat mai jos:

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

Pentru a rezolva o astfel de eroare, asigurați-vă că modulele pe care încercați să le importați au fost instalate. În cazul în care aceasta nu rezolvă eroarea, verificați dacă folosiți ortografia corectă pentru modul și calea corectă a fișierului pentru a accesa modulul.

ValueError

Aceasta este o excepție care apare atunci când o funcție din Python primește o valoare de tipul de date corect, dar valoarea este o valoare inadecvată. De exemplu, funcția Math.sqrt() folosită pentru a găsi rădăcina pătrată a valorilor numerice va returna o valoare ValueError dacă treceți un număr negativ.

Oricât de mult valoarea va fi de tipul corect, adică o valoare numerică, fiind negativă o face o valoare nepotrivită pentru

Funcția int() care convertește un număr sau un șir va returna o valoare ValueError dacă treceți un șir care nu este o valoare șir numeric. Dacă treceți „123” sau „45” funcției, nu returnează nicio eroare, deoarece șirurile pot fi convertite la valoarea întreagă corespunzătoare.

Cu toate acestea, dacă introduceți un șir care nu este o valoare de șir numerică, cum ar fi „Bună ziua”, acesta returnează o valoare ValueError. Acest lucru se datorează faptului că „Bună ziua”, deși este un șir, este inadecvat, deoarece nu are un echivalent întreg.

Un exemplu de cod care generează o valoare ValueError este prezentat mai jos:

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

Erorile din codul de mai sus sunt prezentate mai jos:

Mesajul de eroare generat este următorul:

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

Pentru a corecta eroarea, utilizați valorile adecvate în funcțiile prezentate mai jos:

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

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

IOEroare

IOError (Eroare de intrare/ieșire) este o excepție care apare atunci când o operație de intrare sau de ieșire eșuează. Acest lucru poate fi cauzat de încercarea de a accesa un fișier care nu există, stocarea pe disc insuficientă în dispozitivul dvs., încercarea de a accesa un fișier pe care nu aveți permisiuni suficiente pentru a-l accesa sau când încercați să accesați un fișier care este utilizat în prezent prin alte operațiuni.

Metode precum open(), read(), write() și close() care sunt utilizate în mod obișnuit atunci când lucrați cu fișiere sunt cele care pot provoca o astfel de eroare.

Luați în considerare codul de mai jos care încearcă să deschidă un fișier numit „notes.txt” care nu există. Codul are ca rezultat o IOError care generează FileNotFoundError:

Cu următorul mesaj de eroare:

  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'

Pentru a evita eroarea de mai sus, tot ce trebuie să faceți este să vă asigurați că fișierul „notes.txt” există în directorul în care rulați terminalul. O altă modalitate de a gestiona erorile IO este să utilizați blocul try except, după cum se arată mai jos:

NameErrore

NameError este o excepție pe care o veți întâlni atunci când încercați să utilizați o variabilă, o funcție sau un modul care nu există, nu este definit în domeniul curent sau nu i s-a atribuit o valoare.

  12 cele mai bune proiectoare Galaxy/Star pentru dormitorul copilului dvs

O astfel de eroare apare de obicei atunci când scrieți greșit nume de variabile sau funcții sau le folosiți înainte ca acestea să fie definite. Utilizarea unui modul fără a-l importa va avea ca rezultat, de asemenea, o NameError.

Următorul cod va avea ca rezultat o excepție 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

Următoarele mesaje de eroare rezultă din codul de mai sus:

Un exemplu de mesaj NameError este afișat mai jos:

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

Pentru a rezolva o astfel de NameError, asigurați-vă că nu utilizați module înainte de a le importa, nu folosiți variabile sau funcții înainte de a le defini și nu scrieți greșit numele de funcții sau variabile:

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

y = 23
print(y)

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

IndexError

O IndexError este o excepție care apare atunci când încercați să accesați un index dintr-o listă sau un tuplu care este în afara intervalului. Luați în considerare lista de mai jos:

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

Lista are cinci elemente. Python numără indici de la 0 (zero). Prin urmare, lista de mai sus are indici care variază de la 0 la n-1, n fiind numărul sau elementele din listă. În acest caz, indexul sau lista va varia de la 0 la 4.

Dacă încercați să accesați un element la un index mai mare de 4, veți întâlni o IndexError deoarece indexul este în afara intervalului din lista din care încercați să accesați un element. Codul de mai jos generează o IndexError:

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

Eroarea din cod este prezentată mai jos:

Mesajul IndexError generat este următorul:

  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

Cea mai bună modalitate de a evita o IndexError este să utilizați funcțiile range() și len() pentru a vă asigura că accesați doar elementele care se află în rază astfel:

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

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

KeyError

O KeyError este o excepție care apare atunci când încercați să accesați un articol dintr-un dicționar folosind o cheie, iar cheia nu este găsită în dicționar. Luați în considerare dicționarul de mai jos:

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

Cheile din dicționar sunt „Canada”, „SUA”, „Italia”. Puteți accesa articolele din dicționarul orașelor folosind cele trei taste. Cu toate acestea, dacă încercați să accesați un element folosind o cheie care nu există, cum ar fi „Brazilia”, veți întâlni o KeyError, așa cum se arată mai jos:

Mesajul KeyError generat este afișat mai jos:

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

Pentru a rezolva o KeyError, asigurați-vă că cheile pe care le utilizați pentru a accesa elementele dintr-un dicționar sunt efectiv prezente în dicționar. Pentru a face acest lucru, puteți face o declarație if…else de genul:

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

În acest fel, veți evita să întâlniți KeyErrors atunci când accesați elemente dintr-un dicționar

Concluzie

Când codați în Python, indiferent de nivelul dvs. de expertiză, sunteți obligat să întâlniți erori. Prin urmare, asigurați-vă că vă familiarizați cu diferitele tipuri de erori evidențiate în articol pentru a vă asigura că sunteți capabil să le gestionați atunci când apar.

De asemenea, puteți explora câteva versiuni utile Python pentru a simplifica sarcinile comune.