Hur man hanterar undantag i python

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.

Några gemensamma undantag

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.

  • NameError: Detta undantag höjs när programmet inte kan hitta ett lokalt eller globalt namn. Namnet som inte kunde hittas finns med i felmeddelandet.
  • Skrivfel: Detta undantag höjs när en funktion har passerat ett objekt av den olämpliga typen som dess argument. Mer information om fel typ finns i felmeddelandet.
  • ValueError: Detta undantag uppstår när ett funktionsargument har rätt typ men ett olämpligt värde. 
  • NotImplementedError: Detta undantag höjs när ett objekt ska stödja en operation men det har inte implementerats än. Du bör inte använda detta fel när den angivna funktionen inte är avsedd att stödja typen av inmatningsargument. I dessa situationer, höja en Skrivfel undantag är mer lämpligt.
  • ZeroDivisionError: Detta undantag höjs när du anger det andra argumentet för en division eller modulo-operation som noll.
  • FileNotFoundError: Detta undantag höjdes när filen eller katalogen som programmet begärde inte existerar.

Precis som namnen ovan har de flesta undantagen självförklarande namn.

Hantering av en undantag

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)

Använda annan klausul

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)

Rengöring med slutklausulen

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.

Ett mer komplext exempel

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.

Slutgiltiga tankar

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 Python

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.