Använda tracebacks för att hitta fel

Slutförd

Undantag i Python är en viktig funktion i språket. Du kan bli förvånad över att läsa att något som genererar fel är markerat som en funktion. Den här överraskningen kan bero på att robusta programvaruverktyg inte verkar krascha med en spårning (flera textrader som anger hur felet startade och slutade).

Undantag är dock användbara eftersom de hjälper dig att fatta beslut genom att skapa beskrivande felmeddelanden. De kan hjälpa dig att hantera både förväntade och oväntade problem.

Tracebacks

En spårning är textens brödtext som kan peka på ursprunget (och slutet) för ett ohanterat fel. Om du förstår komponenterna i en spårning blir du effektivare när du åtgärdar fel eller felsöker ett program som inte fungerar bra.

Första gången du stöter på undantag i Python kan du vara frestad att undvika felet genom att ignorera det. När ett program drabbas av ett ohanterat fel visas en spårning som utdata. Som du ser i den här modulen är spårningar användbara. Det finns sätt att hantera felen korrekt så att de inte visas eller så visar de bara användbar information.

Öppna en interaktiv Python-session och försök öppna en icke-existerande fil:

open("/path/to/mars.jpg")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory: '/path/to/mars.jpg'

Utdata har flera viktiga delar. Först nämner traceback ordningen på utdata. Sedan informeras du om att filen är stdin (indata i den interaktiva terminalen) på den första raden i indata. Felet är FileNotFoundError (undantagsnamnet), vilket innebär att filen inte finns eller att katalogen till den inte finns.

Det är mycket information. Det kan vara svårt att förstå varför rad 1 är meningsfull eller vad Errno 2 betyder.

Öppna önskad katalog i Visual Studio Code och skapa en Python-fil med namnet open.py.

Screenshot showing the creation of a new Python file in Visual Studio Code.

Lägg till följande innehåll i filen och spara:

def main():
    open("/path/to/mars.jpg")

if __name__ == '__main__':
    main()

Det är en enda main() funktion som öppnar den obefintliga filen, precis som tidigare. I slutet använder den här funktionen en Python-hjälp som instruerar tolken att köra funktionen main() när den anropas på terminalen. Kör kommandot i en Bash-terminal med Python och kontrollera felmeddelandet:

python3 open.py
Traceback (most recent call last):
  File "/tmp/open.py", line 5, in <module>
    main()
  File "/tmp/open.py", line 2, in main
    open("/path/to/mars.jpg")
FileNotFoundError: [Errno 2] No such file or directory: '/path/to/mars.jpg'

Felutdata är mer meningsfulla nu. Sökvägarna pekar på en enda fil med namnet open.py. Utdata anger att felet startar på rad 5, vilket inkluderar anropet till main(). Därefter följer utdata felet till rad 2 i funktionsanropet open() . Och slutligen FileNotFoundError rapporterar återigen att filen eller katalogen inte finns.

Spårningar innehåller nästan alltid följande information:

  • Alla filsökvägar som ingår för varje anrop till varje funktion.
  • Radnummer som är associerade med varje filsökväg.
  • Namnen på funktioner, metoder eller klasser som används för att skapa ett undantag.
  • Namnet på undantaget som uppstod.