Det är mycket vanligt att stöta på fel vid genomförandet av ett program. Två vanliga typer av fel som du kan behöva hantera är syntaxfel och undantag. Syntaxfel uppstår när du skriver in koden felaktigt. I sådana fall upprepas felaktiga raden av parsern med en pil som pekar på den tidigaste platsen där felet upptäcktes.
Undantag skiljer sig från syntaxfel. De uppstår under genomförandet av ett program när något oväntat händer. Låt oss säga att du ber användaren att skriva in ett nummer för att kunna utföra en uppdelning. Om användaren anger en sträng i stället för ett tal och du försöker dela ett tal med den angivna ingången, kommer programmet att mata ut en Skrivfel
.
När du inte hanterar undantag på rätt sätt, kommer programmet plötsligt att sluta, eftersom det inte vet vad du ska göra i sådana fall. Följande kod är ett exempel:
keep_asking = True while keep_asking: x = int (input ("Ange ett nummer:")) print ("Delning 50 med", x, "ger dig:", 50 / x)
Så länge du anger ett integrerat inmatningsvärde, fungerar programmet korrekt. Men så snart du anger en sträng eller till och med ett decimaltal som inmatning får du en ValueError
undantag.
I denna handledning lär du dig att hantera och höja undantag i Python.
Här är några grundläggande undantag som du kan stöta på när du skriver program. Du kan läsa om många fler inbyggda undantag på den officiella hemsidan.
Skrivfel
undantag är mer lämpligt.Precis som namnen ovan har de flesta undantagen självförklarande namn.
Koden i början av artikeln bad användare att ange ett heltal som inmatning. Om användaren inte angav ett heltal ingången stoppade programmet körning och upphöjde ett undantag för ett värdefel. I det här avsnittet skriver vi en kod för att berätta för användaren att deras ingång inte är ett giltigt heltal värde.
Det första steget i processen är att inkludera koden som du tror kan ge upphov till ett undantag inuti Prova
klausul. Nästa steg är att använda bortsett från
sökord för att hantera det undantag som inträffade i ovanstående kod. Den modifierade koden för användarinmatningen kommer att se ut så här:
keep_asking = True while keep_asking: försök: x = int (input ("Vänligen ange ett nummer:")) print ("Delning 50 med", x, "ger dig:", 50 / x) utom ValueError: print Inmatningen var inte ett heltal. Vänligen försök igen ... ")
Vad som händer här är att programmet försöker köra koden inuti Prova
klausul. Om inget undantag höjdes, hoppar programmet över bortsett från
klausul och resten av koden exekveras normalt. Om ett undantag höjts hoppar programmet över den återstående koden inuti Prova
klausul och typen av undantaget matchas med namnet på undantaget efter bortsett från
nyckelord. Vid en match, koden inuti bortsett från
klausulen körs först och sedan resten av koden efter Prova
klausulen utförs normalt.
När du anger ett heltal som en ingång, ger programmet dig det slutliga resultatet av divisionen. När ett icke-integrerat värde tillhandahålls skriver programmet ett meddelande som ber dig att försöka ange ett helt tal igen. Observera att den här tiden slutar programmet plötsligt när du anger någon ogiltig inmatning.
Du kan ha flera bortsett från
klausuler för att hantera olika undantag. Tänk på att dessa hanterare endast behandlar undantag som inträffade i motsvarande Prova
klausul. De kommer inte att hantera några undantag som uppkommit inom andra undantagshanterare.
Du kan också hantera flera undantag med en enda bortsett från
klausul genom att leda dessa undantag till klausulen som en tupel
.
förutom (ZeroDivisionError, ValueError, TypeError): print ("Något har gått fel ...") # kod för att hantera undantaget
Slutligen kan du också lämna ut namnet på undantaget efter bortsett från
nyckelord. Det rekommenderas vanligtvis inte eftersom koden nu kommer att fånga alla undantag och hantera dem på samma sätt. Detta är inte optimalt eftersom du ska hantera en Skrivfel
undantag på samma sätt som du skulle ha hanterat a ZeroDivisionError
undantag. Vid hantering av undantag är det bättre att vara så specifik som möjligt och bara fånga vad du kan hantera.
En möjlig användning av att fånga alla undantag är att korrekt skriva ut undantagsfelet på skärmen som följande kod:
importera matematisk import sys try: result = math.factorial (2.4) förutom: print ("Något oväntat har hänt.", sys.exc_info () [0]) annars: print ("Factorial är", resultat)
Du kan också använda en annan
klausul i a prova ... förutom
påstående. De annan
klausul avses innehålla kod som måste utföras om Prova
klausul lyfte inte några undantag. Det kan vara användbart att se till att du inte lägger till någon kod i Prova
blockera vars undantag du inte avser att fånga. En sak som är värt att nämna är att om du väljer att använda en annan
klausul, bör du inkludera det efter alla bortsett från
klausuler men före till sist
blockera.
I vårt fall kan vi flytta linjen som skriver ut resultatet av vår division inom annan
blockera.
keep_asking = True while keep_asking: försök: x = int (input ("Vänligen ange ett nummer:")) utom ValueError: print ("Inmatningen var inte ett giltigt heltal. Var god försök igen ...") med ", x" kommer att ge dig: ", 50 / x)
Låt oss säga att du har skrivit en kod i Prova
blockera som ska utföra en uppgift genom att använda en stor mängd resurser. Det är viktigt att frigöra dessa resurser när du är färdig med dem. Detta kan enkelt uppnås genom att använda till sist
klausul.
Koden inuti till sist
klausulen utförs alltid oberoende av om Prova
block höjde ett undantag. Du kan verifiera detta genom att köra följande kod:
keep_asking = True while keep_asking: försök: x = int (input ("Vänligen ange ett nummer:")) utom ValueError: print ("Inmatningen var inte ett giltigt heltal. Var god försök igen ...") med ", x" kommer att ge dig: ", 50 / x) äntligen: print (" Har redan gjort allt som behövs. ")
Om någon av bortsett från
klausuler som du angav hanterar inte det upphöjda undantaget, samma undantag höjas igen efter körning av kod inuti till sist
blockera.
I det här avsnittet skriver vi ett program för att hantera flera undantag. Precis som tidigare exempel, kommer vi att utföra vissa matematiska operationer. Men den här gången kommer vi att ta in inmatningen från en lista.
Följande kod kontrollerar för två undantag, Skrivfel
och ValueError
. De annan
block används för att skriva ut det faktoriella. Du kan se i produktionen att den här koden exekveras endast när inget undantag är upptaget.
importera matte number_list = [10, -5,1.2, 'apple'] för nummer i number_list: försök: number_factorial = math.factorial (number) utom TypeError: print ("Factorial stöds inte för given ingångstyp.") utom ValueError : print ("Factorial accepterar bara positiva heltal värden.", tal, "är inte ett positivt heltal.") annars: print ("Factorial of", number, "är", number_factorial) äntligen: print i användning.")
Ovanstående kod ger följande utmatning:
Factorial av 10 är 3628800 Släppa ut några resurser i bruk. Factorial accepterar bara positiva heltalvärden. -5 är inte ett positivt heltal. Släppa eventuella resurser i bruk. Factorial accepterar bara positiva heltalvärden. 1,2 är inte ett positivt heltal. Släppa eventuella resurser i bruk. Factorial stöds inte för given ingångstyp. Släppa eventuella resurser i bruk.
En annan sak som är värt att notera är att koden inuti till sist
klausul exekveras för varje objekt i listan.
Jag hoppas att denna handledning hjälpte dig att förstå undantagshantering i Python. Tveka inte att se vad vi har till salu och studera på marknaden, och tveka inte att ställa några frågor och ge din värdefulla feedback genom att använda foderet nedan.
Korrekt hantering av undantag kan vara till stor hjälp i situationer där ett program avslutas efter att det fått en oväntad inmatning inte är genomförbar. Om du har några frågor om undantagshantering i Python, var snäll och låt mig veta i kommentarerna.
Lär dig Python med vår kompletta handledning för pythonhandledning, oavsett om du bara har börjat eller du är en erfaren kodare som vill lära dig nya färdigheter.