Göm menyn

Undantag

Ett undantag (eng. exception) är en extraordinär mer eller mindre oförutsägbar händelse som gör att ett program inte har möjlighet att fortsätta köras.

Grundidén med undantag är att kunna hantera olika typer av saker som kan inträffa, men som inträffar mycket sällan. Istället för att hela tiden testa efter sådana specialfall, så kör man på som om allt var okej och fångar upp undantagen i separat kod. Fördelen är att huvuddelen av koden speglar normalfallet.

Pythons vanliga beteende vid undantag är att avbryta körning och att skriva ut ett meddelande. Vi kan dock fånga upp undantag genom att använda en undantagshanterare.

Anropsstacken (traceback) visar vilken kod som kördes innan felet uppstod.

Sista raden visar vilket undantag (typ av fel) som har inträffat samt ett felmeddelande.

Dokumentation

Några vanliga undantag

Exempelkod Undantag Felmeddelande
a NameError name 'a' is not defined
b[42] IndexError list index out of range
"abc"[2]='q' TypeError 'str' object does not support item assignment
$!#& SyntaxError invalid syntax
2/0 ZeroDivisionError division by zero
int("abc") ValueError invalid literal for int() with base 10: 'abc'

Det finns ett sextiotal olika undantag i Python. Vi kan också skapa egna undantag, men det kommer vi inte att gå igenom i den här kursen.

Exempel

Sista if-satsen ser till att find_root() anropas när vi kör filen, men inte när vi importerar den.

Exempel med felkontroller

Exempel med undantagshantering

Istället för att kontrollera om värdet är rätt så kan vi försöka att köra koden. Ifall något går fel i koden kommer ett undantag att kastas, och då kan vi hantera det på ett separat ställe med hjälp try-catch.

Olika möjligheter med try/except

Dokumentation

Undantagshanterare på flera nivåer

Gör ej så här! Detta exempel visar vad som kan gå fel när undantagshantering görs på flera nivåer. När f3 kastar FooError kommer det att fångas upp av f1 och passera förbi f2 helt. För att lösa detta problem bör f2 också fånga upp FooError, göra eventuell hantering och sedan kasta vidare undantaget till f1.

Att kasta och skicka vidare undantag

Vi kan när som helst kasta ett undantag som ett sätt att hoppa ur den aktuella programkörningen. Om det finns en undantagshanterare hamnar vi i den, annars avbryts körningen. Om vi vill kasta ett undantag (t.ex. ValueError) kan vi skriva raise ValueError.

Vi kan i vår undantagshanterare både fånga upp och skicka vidare undantaget, så att eventuella undantagshanterare på yttre nivåer också kan hantera det.

Dokumentation

Undantagshantering som flödeskontroll

Det faktum att vi kan ha undantagshanterare på flera olika nivåer, och dessutom kan skapa egna undantag, gör att vi mycket väl skulle kunna använda undantagen som ett kreativt sätt att hoppa mellan olika platser i koden. Detta anses av många vara en dålig idé.


Sidansvarig: Peter Dalenius
Senast uppdaterad: 2016-08-15