| Den här artikelnbehöverkällhänvisningar för att kunnaverifieras.(2020-12) Åtgärda genom att lägga till pålitliga källor (gärna som fotnoter). Uppgifter utan källhänvisning kanifrågasättas och tas bort utan att det behöver diskuteras pådiskussionssidan. |
Undantagshantering (engelska:exception handling) är mekanismer iprogramspråk ellerdatorhårdvara som ändrar det normalaprogramflödet för att hanteraundantag (engelska:exception). Vid ett undantag sparasprocessornsexekveringstillstånd och programflödet omdirigeras till en undantagshanterare (engelska:exception handler).
Beroende på situationen kan undantagshanteraren välja att återuppta programflödet där det avbröts, genom att använda det sparade exekveringstillståndet. Exempelvis återupptas programflödet eftersidfel utan problem. Vid oväntaddivision med noll finns det däremot inget självklart sätt att återuppta programflödet, eftersom beräkningen som försökte göras sannolikt skulle bli felaktig om man försökte fortsätta. Därför brukar undantagshanteraren vid sådana undantag avsluta det felandeprogrammet, åtminstone underutvecklingsprocessen (och registrera på vilken programrad undantaget skedde) eftersom undantaget kan bero på enbugg, och återstarta på ett lämpligt sätt i kundprogramvara.
Mjukvaruundantag definieras i ett programsprogramkod som ett alternativ tillfelkoder, medan hårdvaruundantag hör till en viss processor.
Från ettprogrammerarperspektiv är mjukvaruundantag ett sätt att signalera att enprogramprocedur inte kunde utföras på normalt vis, vilket till exempel kan ske närinparametrar är ogiltiga (exempelvis ogiltiga personnummer) eller när en resurs som proceduren behöver saknas (endatafil som saknas, eller attdiskenheten är full). Isystem som saknar undantagshantering måste proceduren skicka en felkod till anropande procedurer, vilket kan göra programkoden svåröverskådlig.
Exempel på hårdvaruundantag är:sidfel ochdivision med noll. Hårdvaruundantag är besläktade medavbrott, med skillnaden att hårdvaruundantag orsakas av programfel, medan avbrott orsakas av externa händelser (exempelvissignaler från hårddisk ellertangentbord).
En del programspråk har inbyggt stöd för undantagshantering. I sådana språk orsakar ett undantag attstacken rullas upp tills en undantagshanterare hittas. Det vill säga om funktionenf, som har en hanterareH för undantagU, anropar funktioneng som i sin tur anroparh, och ett undantag av typenU inträffar ih, kommerh ochg att avbrytas ochH if kommer att hanteraU.
Med bortseende från mindre syntaktiska skillnader förekommer allmänt endast ett fåtal olika undantagshanteringstyper. I den mest populära typen utlöses ett undantag med en specifikprogramsats (throw,raise) med ettundantagsobjekt som beskriver undantaget. Den del av programmet som täcks av en undantagshanterare markeras medtry eller liknande och avslutas med den första hanteringsklausulen som markeras medcatch,except,rescue eller liknande. Flera hanteringsklausuler kan förekomma och var och en specificerar då det undantag som hanteras.
Några språk har ytterligare en klausul (finally ellerensure) som exekveras oavsett om ett undantag inträffat eller inte, ofta för att frigöra resurser som används inom programblocket som undantagsskyddats.
Ett exempel på hur undantagshanteringskod kan se ut följer (medC#-liknandesyntax):
FileStreamstm=null;try{// Här börjar undantagshanteringen.stm=newFileStream("datafil.txt",FileMode.Open);// Öppna en fil som kanske inte finns.if(FilInnehållOgiltigt(stm))thrownewInvalidFileContentsException("datafil.dat");// Undantag skapas.}catch(InvalidFileContentsExceptionex){// Undantagshantering för det skapade undantaget.Console.WriteLine("Innehållet i filen '"+ex.Filename+"' är ogiltigt.");}catch(IOExceptionex){// Undantagshantering för IO-fel som kanske uppstod när filen öppnades.Console.WriteLine("Ett fel uppstod vid bearbetningen av datafil.txt.");}catch{// Undantagshantering för generella undantag.Console.WriteLine("Ett okänt fel har inträffat.");}finally{if(stm!=null)stm.Close();// Städa upp eventuell öppen fil.}