Spåraren
Det röda är din vän
Du har nu skrivit tillräckligt med kod för att ha sett det: ett rött block av text som ersätter ditt förväntade resultat i terminalen. Kanske frös du. Kanske stängde du terminalen och öppnade den igen i hopp om att det skulle försvinna.
Det försvinner inte. Men när du förstår vad du faktiskt tittar på så är det din vän.
Ett felmeddelande i Python kallas en Traceback Den fullständiga felrapporten Python skriver ut när något går snett. Innehåller filnamn, radnummer och feltyp. Läses nedifrån och upp. . Det är din bästa vän i felsökningen, för den berättar exakt vilken fil som är inblandad, vilken rad det gick snett på och vad som gick fel. En karta som leder dig till felet, och när du lär dig läsa den löser du problem snabbare än någonsin.
Buggen du ska jaga har förresten en bokstavlig förfader, den du mötte i Verkstaden byggs. Den sitter kvar i loggboken:
Hur en traceback är uppbyggd
Här är ett kort program med ett fel inbyggt, kör det och läs utskriften noga.
Redo.
Traceback:en är uppbyggd i tre lager. Överst: Traceback (most recent call last), Python inleder sin rapport. I mitten: filnamnet, radnumret och den faktiska kodraden. Längst ned: feltypen och förklaringen.
Börja alltid med den sista raden. I exemplet du nyss körde är den:
TypeError: can only concatenate str (not "int") to str Läs den i två delar. Före kolonet står feltypen: TypeError, något har fel typ. Efter kolonet står förklaringen: + kan bara sätta ihop strängar med strängar, inte med ett heltal. Gå sedan ett lager upp: line 3 och den utpekade kodraden visar var det hände. Nu vet du både vad och var, innan du ens tittat på koden. Där ligger alder, ett heltal, mitt i en strängsammanslagning.
Resten av delen går igenom de tre feltyper du kommer möta oftast just nu.
SyntaxError, Python startar inte ens
SyntaxError Ett fel i kodens struktur som Python hittar innan programmet körs. Ofta en saknad parentes, kolon eller citationstecken. uppstår innan programmet kör en enda rad. Python läser igenom hela skriptet och kontrollerar strukturen. Hittar det något som bryter mot grammatiken vägrar det köra.Redo.
Det vanligaste SyntaxError är en saknad parentes eller ett saknat kolon.
NameError, variabeln finns inte
NameError Uppstår när du försöker använda ett variabelnamn Python inte känner igen. Vanligaste orsak: stavfel eller skillnad i versaler och gemener. uppstår när du försöker använda ett namn Python inte känner igen. Nästan alltid: variabeln har inte skapats, eller du har stavat fel.Redo.
Python är skiftlägeskänsligt. hälsning och Hälsning är två helt olika namn. Prova att rätta felet i sandlådan.
TypeError, du blandade äpplen och päron
TypeError Uppstår när en operation utförs på ett värde av fel typ, till exempel när du lägger ihop en str och ett int utan konvertering. uppstår när du försöker utföra en operation med ett värde av fel typ. Python kan lägga ihop strängar. Python kan lägga ihop heltal. Men inte en sträng och ett heltal, det vet inte hur resultatet ska se ut. Det var exakt det som fällde exemplet i början av delen.Redo.
Lösningen är typkonvertering med str(), precis det vi jobbade med i Dialogen & konvertering. Typfel och typkonvertering hör ihop: felet talar om att typerna inte stämmer, konverteringen är lösningen.
Uppgift: Trigga och reparera
Skapa filen spararen.py.
Skriv en rad kod som orsakar ett
NameError, anropa en variabel du inte skapat. Kör skriptet, läs felmeddelandet och skriv en kommentar ovanför raden som förklarar vad Python faktiskt säger. Rätta sedan felet.Skriv en rad kod som orsakar ett
TypeError, försök lägga ihop en sträng och ett heltal med+. Läs felmeddelandet, skriv en förklarande kommentar och rätta felet medstr().Trigga ett
SyntaxErrorgenom att ta bort den avslutande parentesen i enprint()-sats. Notera vilken rad Python pekar på. Är det samma rad som den saknade parentesen faktiskt sitter på?Rätta alla tre felen så att skriptet kör klart utan felmeddelanden. Gå till Source Control-fliken i VS Code, skriv ett commit-meddelande och pusha.
Vad händer om
Skriv int("42") i sandlådan, fungerar det? Byt sedan ut "42" mot ditt eget namn. Du får ett felmeddelande av en typ vi inte gått igenom ännu. Kan du läsa det och förstå vad Python klagar på?
Motivera & reflektera
Välj ett av felen du framkallade och skriv med egna ord vad Python försökte säga dig. Hur vet du var i tracebacken du ska börja läsa?
Nästa nivå
Framkalla ett fel vi inte gått igenom, till exempel IndexError genom att nå ett index utanför en lista, eller ZeroDivisionError. Läs tracebacken och beskriv vad den säger, utan att först slå upp feltypen. Kan du lösa det bara utifrån meddelandet?