10 almindelige Python-fejltyper og hvordan man løser dem

Som programmør er du forpligtet til at støde på fejl, mens du udvikler software. Dette kan variere fra fejl i din logik, der fører til uventede resultater, fejl, der opstår ved at overtræde reglerne for et programmeringssprog, til endda fejl, der opstår, mens du kører dit program, blandt mange andre. Disse fejl omtales almindeligvis som fejl.

Bugs er allestedsnærværende i alle programmeringssprog, uanset hvor nemt det er at lære eller bruge sproget.

I Python, for eksempel, selvom sproget understreger læsbarhed, følger en udtryksfuld syntaks og anses for relativt let at lære og bruge sammenlignet med andre programmeringssprog, er du stadig ikke immun over for programmeringsfejl, når du bruger Python.

Da fejl er nødt til at opstå, er en god måde at håndtere dem på at lære om de forskellige typer fejl, der kan opstå, og hvordan de opstår. Dette giver dig mulighed for at undgå eller minimere disse fejl under programmering og også vide, hvordan du håndterer dem, når de opstår.

Her er nogle af de almindelige Python-fejl, som du kan støde på, mens du programmerer med sproget:

Syntaksfejl

En syntaksfejl er en fejl, der opstår, når du skriver kode, der overtræder reglerne for det programmeringssprog, du bruger. Dette resulterer i en ugyldig kodelinje.

I Python, for eksempel, når du udskriver en streng, skal den sættes mellem anførselstegn. Undladelse af at gøre det resulterer i en syntaksfejl.

En syntaksfejl kan også opstå, når du savner åbning eller lukning af parenteser, firkantede parenteser eller krøllede klammer, staver forkerte nøgleord eller funktionsnavne, mangler koloner i slutningen af ​​flowkontroludsagn, eller når du savner nødvendige operatorer i udtryk.

Generelt vil der opstå syntaksfejl, hvis du overtræder en regel om, hvordan Python-kode skal skrives.

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

Når du kører ovenstående kode, vil du løbe ind i en fejlmeddelelse som vist nedenfor:

Fejlmeddelelsen fra at køre koden er som følger:

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

For at løse disse fejl skal du bruge den rigtige Python-syntaks som vist nedenfor:

print("Hello World")

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

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

Indrykningsfejl

I modsætning til andre sprog som Java, C eller C++, der bruger krøllede klammeparenteser til at adskille kodeblokke, bruger Python indrykning til at definere hierarkiet og strukturen af ​​kodeblokke. For eksempel, når du skriver kontroludsagn i Java, er al den kode, der skal udføres, når betingelsen er blevet evalueret, indeholdt i krøllede klammeparenteser.

I Python vil kodeblokken dog være indrykket. En typisk indrykning i Python består af fire mellemrum eller en tabulator. Antallet af mellemrum er dog ligegyldigt, så længe det forbliver konsistent i hele koden, der skrives.

Som Python-programmør vil du sandsynligvis støde på indrykningsfejl, når du undlader at tilføje påkrævet indrykning, såsom når du skriver kontroludsagn eller funktioner, når du bruger både tabulator og mellemrum til at lave indrykning, da det forvirrer fortolkeren, når du sætter indrykninger på det forkerte sted, eller når dine fordybninger ikke er konsistente i hele din kodebase.

Et eksempel på kode, der resulterer i en indrykningsfejl, er vist nedenfor:

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

Fejlmeddelelserne som følge af koden ovenfor er vist nedenfor:

  Sådan fjerner du zoom-profilbillede

Fejlmeddelelsen fra at køre koden er som følger:

  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

For at rette fejlene skal du indrykke linjen efter if-sætningen som en indrykning og sikre, at den matcher indrykningen i resten af ​​koden som vist nedenfor:

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

Typefejl

I Python er en TypeError en undtagelse, der opstår, når du forsøger at udføre en operation ved hjælp af en inkompatibel datatype. For eksempel, hvis du prøver at tilføje en streng og et heltal eller sammenkæde en strengdatatype med et heltal, vil du støde på en TypeError.

Du kan også støde på TypeErrors, når du bruger funktioner eller metoder med forkerte datatyper, når du forsøger at bruge et ikke-heltalsindeks til at få adgang til elementer i en iterabel, såsom en liste, eller når du forsøger at iterere gennem et objekt, der ikke kan itereres.

Generelt vil enhver handling, der bruger en forkert datatype, føre til en TypeError.

Eksempler på operationer, der kan føre til TypeErrors, er vist nedenfor:

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

Fejlmeddelelserne som følge af ovenstående kode er vist nedenfor:

Et eksempel på TypeError-meddelelse fra koden er vist nedenfor:

  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

For at fjerne fejlene skal du bruge de korrekte datatyper eller typekonverteringer som vist nedenfor:

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

AttributError

I Python opstår der en AttributeError, når du forsøger at bruge en attribut, der ikke findes på objektet, eller kalder en metode, der ikke findes på det objekt, det kaldes på. En AttributeError viser, at et objekt ikke har en attribut eller metode, der kaldes på det.

For eksempel, hvis du kalder en strengmetode på et heltal, vil du løbe ind i en AttributeError, fordi metoden ikke findes på den type objekt, du kalder den på.

I eksemplet vist nedenfor kaldes kapitalize()-metoden, som bruges til at konvertere det første bogstav i en streng til stort bogstav, på et heltal. Resultatet er en attributfejl, fordi int ikke har capitalize()-metoden.

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

Kørsel af denne kode resulterer i fejlmeddelelsen vist nedenfor:

AttributeError-meddelelsen fra koden er som følger:

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

For at løse en AttributeError skal du sikre dig, at metoden eller attributten, du kalder, findes på den type objekt, du kalder den på. I dette tilfælde løser kald af capitalize() på en strengdatatype denne fejl som vist nedenfor:

Importfejl

Importfejlen i Python opstår, når du forsøger at importere et modul, der ikke kan findes eller ikke er tilgængeligt i dit nuværende miljø. Det kan være, at det endnu ikke er installeret, at du ikke har konfigureret dets sti korrekt, eller at du har stavet det modul, du prøver at installere, forkert.

En ImportError har en enkelt underordnet underklasse kaldet ModuleNotFoundError, som er den fejl, der vises, når du forsøger at importere et modul, der ikke kan findes.

  Netværksbåndbreddeovervågning er let med disse 6 værktøjer

For eksempel, koden nedenfor med forsøg på at importere dataanalysebiblioteket pandas kaster en sådan fejl, fordi modulet endnu ikke er installeret.

Den genererede ImportError-meddelelse er vist nedenfor:

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

For at løse en sådan fejl skal du sikre dig, at de moduler, du prøver at importere, er installeret. Hvis det ikke løser fejlen, skal du kontrollere, om du bruger den korrekte stavning til modulet og den korrekte filsti for at få adgang til modulet.

ValueError

Dette er en undtagelse, der opstår, når en funktion i Python modtager en værdi af den korrekte datatype, men værdien er en upassende værdi. For eksempel vil Math.sqrt()-funktionen, der bruges til at finde kvadratroden af ​​numeriske værdier, returnere en ValueError, hvis du indtaster et negativt tal.

Så meget som værdien vil være af den korrekte type, dvs. en numerisk værdi, er den negativ, hvilket gør det til en upassende værdi for

Funktionen int(), som konverterer et tal eller en streng, vil returnere en ValueError, hvis du indsætter en streng, der ikke er en numerisk strengværdi. At sende “123” eller “45” til funktionen returnerer ingen fejl, da strengene kan konverteres til den passende heltalsværdi.

Men hvis du sender en streng, der ikke er en numerisk strengværdi, såsom “Hej”, returnerer den en ValueError. Dette skyldes, at “Hej”, selvom det er en streng, er upassende, da det ikke har et heltalsækvivalent.

Et eksempel på kode, der genererer en ValueError, er vist nedenfor:

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

Fejlene fra koden ovenfor er vist nedenfor:

Den genererede fejlmeddelelse er som følger:

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

For at rette fejlen skal du bruge passende værdier i funktionerne som vist nedenfor:

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

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

IOEfejl

IOError (Input/Output Error) er en undtagelse, der opstår, når en input- eller outputhandling mislykkes. Dette kan være forårsaget af forsøg på at få adgang til en fil, der ikke eksisterer, utilstrækkelig disklagerplads på din enhed, forsøg på at få adgang til en fil, som du ikke har tilstrækkelige tilladelser til at få adgang til, eller når du forsøger at få adgang til en fil, der aktuelt bruges ved andre operationer.

Metoder såsom open(), read(), write() og close(), som typisk bruges, når man arbejder med filer, er dem, der sandsynligvis forårsager en sådan fejl.

Overvej koden nedenfor, som forsøger at åbne en fil kaldet “notes.txt”, som ikke eksisterer. Koden resulterer i en IOError, som rejser FileNotFoundError:

Med følgende fejlmeddelelse:

  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'

For at undgå fejlen ovenfor er alt, hvad du skal gøre, at sikre, at “notes.txt”-filen findes i den mappe, du kører terminalen i. En anden måde at håndtere IOErrors på er at bruge try except-blokken, som vist nedenfor:

Navnefejl

Navnefejlen er en undtagelse, som du vil støde på, når du forsøger at bruge en variabel, funktion eller modul, der ikke eksisterer, ikke er defineret i det aktuelle omfang eller ikke er blevet tildelt en værdi.

En sådan fejl opstår typisk, når du staver variabel- eller funktionsnavne forkert eller bruger dem, før de er defineret. Brug af et modul uden at importere det vil også resultere i en NameError.

  Kickstart din nye podcast med Buzzsprout

Følgende kode vil resultere i en NameError-undtagelse:

# 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

Følgende fejlmeddelelser stammer fra koden ovenfor:

Et eksempel på NameError-meddelelse vises nedenfor:

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

For at løse en sådan navnefejl skal du sikre dig, at du ikke bruger moduler, før du importerer dem, at du ikke bruger variabler eller funktioner, før du definerer dem, og at du ikke staver funktions- eller variabelnavne forkert:

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

y = 23
print(y)

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

Indeksfejl

En IndexError er en undtagelse, der opstår, når du forsøger at få adgang til et indeks på en liste eller tuple, der er uden for rækkevidde. Overvej listen nedenfor:

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

Listen har fem elementer. Python tæller indeks fra 0(nul). Derfor har listen ovenfor indekser fra 0 til n-1, hvor n er tallet eller elementerne på listen. I dette tilfælde vil indekset eller listen variere fra 0 til 4.

Hvis du forsøger at få adgang til et element ved et indeks større end 4, vil du løbe ind i en IndexError, fordi indekset er uden for rækkevidde på den liste, du forsøger at få adgang til et element fra. Koden nedenfor genererer en IndexError:

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

Fejlen fra koden er vist nedenfor:

Den genererede IndexError-meddelelse er som følger:

  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

Den bedste måde at undgå en IndexError på er at bruge funktionerne range() og len() for at sikre, at du kun får adgang til elementer, der er inden for rækkevidde som f.eks.

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

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

KeyError

En KeyError er en undtagelse, der opstår, når du forsøger at få adgang til et element fra en ordbog ved hjælp af en nøgle, og nøglen ikke findes i ordbogen. Overvej ordbogen nedenfor:

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

Nøglerne i ordbogen er “Canada”, “USA”, “Italien”. Du kan få adgang til emnerne fra byordbogen ved hjælp af de tre taster. Men hvis du forsøger at få adgang til et element ved hjælp af en nøgle, der ikke eksisterer, såsom “Brasilien”, vil du løbe ind i en KeyError, som vist nedenfor:

Den genererede KeyError-meddelelse er vist nedenfor:

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

For at løse en KeyError skal du sikre dig, at de nøgler, du bruger til at få adgang til elementer i en ordbog, faktisk findes i ordbogen. For at gøre dette kan du en if…else-udsagn som sådan:

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

På denne måde undgår du at løbe ind i KeyErrors, når du får adgang til elementer fra en ordbog

Konklusion

Når du koder i Python, kan du, uanset dit ekspertiseniveau, støde på fejl. Sørg derfor for at sætte dig ind i de forskellige typer fejl, der er fremhævet i artiklen, for at sikre, at du er i stand til at håndtere dem, når de opstår.

Du kan også udforske nogle nyttige Python one-liners for at forenkle almindelige opgaver.