10 vanlige Python-feiltyper og hvordan du løser dem

Som programmerer er du nødt til å støte på feil mens du utvikler programvare. Dette kan variere fra feil i logikken din som fører til uventede resultater, feil som oppstår ved brudd på reglene for et programmeringsspråk, til feil som oppstår mens du kjører programmet, blant mange andre. Disse feilene blir ofte referert til som bugs.

Bugs er allestedsnærværende i alle programmeringsspråk uavhengig av hvor enkelt det er å lære eller bruke språket.

I Python, for eksempel, selv om språket legger vekt på lesbarhet, følger en uttrykksfull syntaks og anses som relativt enkelt å lære og bruke sammenlignet med andre programmeringsspråk, er du fortsatt ikke immun mot programmeringsfeil når du bruker Python.

Siden feil garantert oppstår, er en god måte å håndtere dem på å lære om de ulike typene feil som kan oppstå og hvordan de oppstår. Dette lar deg unngå eller minimere disse feilene mens du programmerer og vet også hvordan du skal håndtere dem når de oppstår.

Her er noen av de vanlige Python-feilene du kan støte på når du programmerer med språket:

Syntaksfeil

En syntaksfeil er en feil som oppstår når du skriver kode som bryter reglene for programmeringsspråket du bruker. Dette resulterer i en ugyldig kodelinje.

I Python, for eksempel, når du skriver ut en streng, må den settes mellom anførselstegn. Unnlatelse av å gjøre det resulterer i en syntaksfeil.

En syntaksfeil kan også oppstå når du savner åpning eller lukking av parenteser, firkantede parenteser eller krøllete parenteser, feilstaving av nøkkelord eller funksjonsnavn, mangler kolon på slutten av flytkontrollutsagn, eller når du savner nødvendige operatorer i uttrykk.

Generelt vil syntaksfeil oppstå hvis du bryter 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 kjører koden ovenfor, får du en feilmelding som vist nedenfor:

Feilmeldingen fra kjøring av 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 å løse disse feilene, bruk riktig 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))

InnrykkFeil

I motsetning til andre språk som Java, C eller C++, som bruker krøllete klammeparenteser for å skille kodeblokker, bruker Python innrykk for å definere hierarkiet og strukturen til kodeblokker. For eksempel, når du skriver kontrollsetninger i Java, er all koden som skal kjøres når tilstanden er evaluert inne i krøllete klammeparenteser.

I Python vil imidlertid kodeblokken bli rykket inn. En typisk innrykk i Python består av fire mellomrom eller en tabulator. Antall mellomrom spiller imidlertid ingen rolle så lenge det forblir konsistent gjennom hele koden som skrives.

Som Python-programmerer vil du sannsynligvis støte på innrykkfeil når du ikke klarer å legge til nødvendig innrykk, for eksempel når du skriver kontrollsetninger eller funksjoner, når du bruker både tabulator og mellomrom for å lage innrykk ettersom det forvirrer tolken, når du legger inn innrykk på feil sted eller når innrykk ikke er konsistente gjennom hele kodebasen.

Et eksempel på kode som resulterer i en innrykksfeil 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")

Feilmeldingene som følge av koden ovenfor vises nedenfor:

  Hvordan søke etter noen på Tinder

Feilmeldingen fra kjøring av 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 å korrigere feilene må du trekke inn linjen etter if-setningen som et innrykk og sikre at det samsvarer med innrykk i resten av 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")

TypeError

I Python er en TypeError et unntak som oppstår når du prøver å utføre en operasjon med en inkompatibel datatype. For eksempel, hvis du prøver å legge til en streng og et heltall eller sette sammen en strengdatatype med et heltall, vil du støte på en TypeError.

Du kan også støte på TypeErrors når du bruker funksjoner eller metoder med feil datatyper, når du prøver å bruke en ikke-heltallsindeks for å få tilgang til elementer i en iterabel, for eksempel en liste, eller når du prøver å iterere gjennom et objekt som ikke kan itereres.

Vanligvis vil enhver operasjon som bruker en feil datatype føre til en TypeError.

Eksempler på operasjoner som 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"])

Feilmeldingene som følge av koden ovenfor vises nedenfor:

Et eksempel på TypeError-melding fra koden vises 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 å fjerne feilene, bruk riktige 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])

AttributeError

I Python oppstår det en AttributeError når du prøver å bruke et attributt som ikke finnes på objektet eller kaller en metode som ikke finnes på objektet det kalles på. En AttributeError viser at et objekt ikke har et attributt eller en metode som kalles på det.

For eksempel, hvis du kaller en strengmetode på et heltall, vil du støte på en AttributeError fordi metoden ikke eksisterer på den typen objekt du kaller den på.

I eksemplet vist nedenfor kalles capitalize()-metoden, som brukes til å konvertere den første bokstaven i en streng til stor bokstav, på et heltall. Resultatet er en attributtfeil fordi int ikke har capitalize()-metoden.

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

Å kjøre denne koden resulterer i feilmeldingen vist nedenfor:

AttributeError-meldingen 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 å løse en AttributeError, sørg for at metoden eller attributtet du kaller, eksisterer på den typen objekt du kaller den på. I dette tilfellet løser det å kalle capitalize() på en strengdatatype denne feilen som vist nedenfor:

Importerror

Importfeilen i Python oppstår når du prøver å importere en modul som ikke finnes eller ikke er tilgjengelig i ditt nåværende miljø. Det kan være at den ikke er installert ennå, at du ikke har konfigurert banen riktig eller at du har stavet feil til modulen du prøver å installere.

En ImportError har en enkelt underordnet underklasse kalt ModuleNotFoundError som er feilen som oppstår når du prøver å importere en modul som ikke blir funnet.

  10 beste Adobe After Effects-maler for imponerende visuelle effekter

For eksempel, koden nedenfor med prøver å importere dataanalysebiblioteket pandas gir en slik feil fordi modulen ennå ikke er installert.

ImportError-meldingen som genereres vises nedenfor:

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

For å løse en slik feil, sørg for at modulene du prøver å importere er installert. Hvis det ikke løser feilen, sjekk om du bruker riktig stavemåte for modulen og riktig filbane for å få tilgang til modulen.

ValueError

Dette er et unntak som oppstår når en funksjon i Python mottar en verdi av riktig datatype, men verdien er en upassende verdi. For eksempel vil Math.sqrt()-funksjonen som brukes til å finne kvadratroten av numeriske verdier returnere en ValueError hvis du sender inn et negativt tall.

Så mye som verdien vil være av riktig type, det vil si en numerisk verdi, er det en negativ verdi som er upassende for

Funksjonen int() som konverterer et tall eller en streng vil returnere en ValueError hvis du sender inn en streng som ikke er en numerisk strengverdi. Å sende «123» eller «45» til funksjonen returnerer ingen feil siden strengene kan konverteres til riktig heltallsverdi.

Men hvis du sender inn en streng som ikke er en numerisk strengverdi, for eksempel «Hello», returnerer den en ValueError. Dette er fordi «Hei», selv om det er en streng, er upassende siden den ikke har en heltallsekvivalent.

Et eksempel på kode som 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)

Feilene fra koden ovenfor er vist nedenfor:

Feilmeldingen som genereres er som følger:

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

For å rette feilen, bruk passende verdier i funksjonene som vist nedenfor:

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

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

IOFeil

IOError (Input/Output Error) er et unntak som oppstår når en inngangs- eller utgangsoperasjon mislykkes. Dette kan skyldes at du prøver å få tilgang til en fil som ikke eksisterer, utilstrekkelig lagringsplass på enheten din, prøver å få tilgang til en fil du ikke har tilstrekkelig tilgang til eller når du prøver å få tilgang til en fil som brukes for øyeblikket ved andre operasjoner.

Metoder som open(), read(), write() og close() som vanligvis brukes når man jobber med filer er de som sannsynligvis vil forårsake en slik feil.

Tenk på koden nedenfor som prøver å åpne en fil kalt «notes.txt» som ikke eksisterer. Koden resulterer i en IOError som øker FileNotFoundError:

Med følgende feilmelding:

  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 å unngå feilen ovenfor, er alt du trenger å gjøre å sørge for at «notes.txt»-filen finnes i katalogen du kjører terminalen i. En annen måte å håndtere IOErrors på er å bruke try except-blokken, som vist nedenfor:

Navnefeil

NameError er et unntak du vil støte på når du prøver å bruke en variabel, funksjon eller modul som ikke eksisterer, ikke er definert i gjeldende omfang eller ikke har blitt tildelt en verdi.

En slik feil oppstår vanligvis når du feilstaver variabel- eller funksjonsnavn eller bruker dem før de er definert. Bruk av en modul uten å importere den vil også resultere i en NameError.

  7 beste ferdiglagde fakturamaler som kan brukes umiddelbart [Word, Notion]

Følgende kode vil resultere i et NameError-unntak:

# 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 feilmeldinger er resultatet av koden ovenfor:

Et eksempel på NameError-melding vises nedenfor:

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

For å løse en slik navnefeil, sørg for at du ikke bruker moduler før du importerer dem, at du ikke bruker variabler eller funksjoner før du definerer dem, og at du ikke staver funksjons- eller variabelnavn feil:

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

y = 23
print(y)

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

Indeksfeil

En IndexError er et unntak som oppstår når du prøver å få tilgang til en indeks i en liste eller tuppel som er utenfor rekkevidde. Tenk på listen nedenfor:

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

Listen har fem elementer. Python teller indekser fra 0(null). Derfor har listen ovenfor indekser fra 0 til n-1, hvor n er tallet eller elementene i listen. I dette tilfellet vil indeksen eller listen variere fra 0 til 4.

Hvis du prøver å få tilgang til et element med en indeks som er større enn 4, får du en IndexError fordi indeksen er utenfor rekkevidden i listen du prøver å få tilgang 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)

Feilen fra koden vises nedenfor:

IndexError-meldingen som genereres 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 beste måten å unngå en IndexError på er å bruke funksjonene range() og len() for å sikre at du bare får tilgang til elementer som er innenfor rekkevidde, slik:

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

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

KeyError

En KeyError er et unntak som oppstår når du prøver å få tilgang til et element fra en ordbok ved hjelp av en nøkkel, og nøkkelen ikke finnes i ordboken. Tenk på ordboken nedenfor:

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

Nøklene i ordboken er «Canada», «USA», «Italia». Du kan få tilgang til elementene fra byordboken ved å bruke de tre tastene. Men hvis du prøver å få tilgang til et element ved hjelp av en nøkkel som ikke eksisterer, for eksempel «Brasil», vil du støte på en KeyError, som vist nedenfor:

KeyError-meldingen som genereres, vises nedenfor:

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

For å løse en nøkkelfeil, sørg for at nøklene du bruker for å få tilgang til elementer i en ordbok, faktisk finnes i ordboken. For å gjøre dette, kan du en if…else-setning som dette:

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åten vil du unngå å støte på KeyErrors når du får tilgang til elementer fra en ordbok

Konklusjon

Når du koder i Python, uavhengig av ekspertisenivået ditt, vil du garantert støte på feil. Sørg derfor for å gjøre deg kjent med de forskjellige typene feil som er fremhevet i artikkelen for å sikre at du er i stand til å håndtere dem når de oppstår.

Du kan også utforske noen nyttige Python one-liners for å forenkle vanlige oppgaver.