Göm menyn

Felsökning

Den första nivån av felsökning handlar om att granska de felmeddelanden som Python ger i form av undantag. Dessa talar inte bara om vilket fel det var som uppstod, utan även var det uppstod. Ifall flera funktioner anropats på vägen till den position där felet uppstod visas dessutom hela anropskedjan dit i en så kallad traceback, något som underlättar felsökningen betydligt.

Detta är en kort förklaring för några av de vanligaste felen:

ZeroDivisionError
Division med noll, omöjligt då talet blir oändligt stort.
AttributeError Objektet ni arbetar med har inte den metod ni försöker komma åt.
ImportError Modulen ni försökt importera går inte att hitta.
IndexError Ni försöker komma åt ett element i en list som inte finns.
KeyError Ni försöker komma åt ett element i en dict som inte finns.
NameError Variabeln ni använder är inte definierad.
SyntaxError Ni har stavat fel eller skrivit fel.
TypeError Ni har angett felaktiga argument till en funktion.
ValueError Ni har angett ett argument med ogiltigt värde till en funktion.

Prova följande:


def div(n):
   return 1.0 / n

def fracs(max, min = 0):
   for num in range(min, max):
       print(div(num))

fracs(10)

Förklaring:

  • Felet är en division med noll (0).
  • Börja med att granska rad 2 i div. Här ser ni att anledningen måste vara att div anropats med 0 som argument.
  • Gå vidare till rad 3 i fracs. Här kan ni se att div anropas med variabeln num som argument. num kommer från range(min, max). Följer ni traceback ytterligare ett steg bakåt kan ni se att min är 0 och max är 10, det innebär att num kommer vara 0 första iterationen. Problemet är identifierat och en möjlig åtgärd är att byta standardvärdet på min från 0 till 1.

Vid mer avancerad felsökning är en debugger det bästa verktyget. Python har en inbyggd debugger som heter pdb. pdb kan köras antingen från Python-tolken eller som en fristående debugger. För att köra pdb från Python-tolken importerar ni modulen pdb. När ni använder pdb i Python-tolken finns det två stycken funktioner ni kan använda er av; run anropas med en kod-sträng som argument och kör sedan kodsträngen i debuggern; pm anropas efter att ett fel uppstått för att navigera i anropshistoriken (traceback) och inspektera variabler.

Ni startar pdb (som en fristående debugger) med följande kommando från terminalen:


$ python3 -m pdb 

När ni kör pdb som en fristående debugger finns det mycket fler kommandon att känna till. Nedan listas de viktigaste, ni kan själva läsa mer i den officiella dokumentationen om pdb

Några användbara kommandon (de flesta har en kortkommando-variant också så länge det inte krockar med ett annat kommando. Testa exempelvis att skriva c istället för continue:

Help Visar hjälp om pdb och dess inbyggda kommandon.
Where Skriver ut aktuell stacktrace.
Break Skapar en stoppunkt.
Step Kör nästa rad, gå in i funktionen ifall raden är ett funktionsanrop.
Next Kör nästa rad, kör funktionsanropet som en enda rad.
Return Kör till slutet av den aktuella funktionen.
Continue Kör till nästa stoppunkt, tills ett fel inträffar eller tills koden är slut.

Sidansvarig: Pontus Haglund
Senast uppdaterad: 2024-08-14