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. |
Python
Emacs
Laborationer och material
Sidansvarig: Pontus Haglund
Senast uppdaterad: 2024-08-14