Ofångade exceptions

Vad händer med exceptions som inte fångas av något catch-block? Det korta svaret är att de terminerar programmet. Ett program som kastar en exception som inte fångas upp på någon nivå i programmet, inte ens i main(), kommer att anropa en inbyggd funktion terminate(), som i sin tur kallar på abort() för att terminera programmet. Funktionen abort() är en normal C-funktion som kan användas om headerfilen <stdlib.h> inkluderas. Den kan användas t.ex. till att avsluta ett program ifall något kritiskt fel hänt. abort() genererar en coredump, d.v.s. en fil som heter core, och som kan utforskas med en debugger.

Vi kanske inte alltid vill att vårt program skall terminera direkt om vi har en ofångad exception. Vi kanske har någon viss resurs eller något i vårt program som måste stängas, firgöras eller på ett annat sätt hanteras. Vi kan i sådana fall specifierara en egen funktion som skall anropas istället för terminate(). Följande program illustrerar hur det kan se ut:

#include <iostream>
#include <exception>
#include <stdlib.h>

// vår egna termineringsfunktion
void betterTerminate () {
  // vår specieliserade felhantering...
  cout << "Aiiee..." << endl;
  
  // vi måste avsluta programmet
  abort ();
}

int main () {
  // sätt en ny 'teminate'
  set_terminate ( betterTerminate );

  cout << "Kastar en exception." << endl;

  // kasta en exception
  throw 1;
}

Notera att vi även inkluderat <exception> för att få tillgång till funktionen set_terminate. Denna funktion tar som argument en pekare till en funktion som returnerar void och inte behöver några parametrar. Varje funktion är en pekare is sig, så vi kan direkt ge namnet på vår egna termineringsfunktion betterTerminate. Vi för inte någon egentlig nytta i betterTerminate, endast ett meddelande skrivs ut på skärmen och däreftern anropas abort(). En termineringsfunktion returnerar aldrig, så den bör anropa t.ex. exit() eller abort() för att terminera programmet. Då programmet ovan körs genereras följande utskrift (programmet har kallats Exception5):

% Exception5
Kastar en exception.
Aiiee...
Abort (core dumped)

Det sista meddelandet kommer från abort(), och indikerar att en core-fil genererats. På icke-Unixsystem genererar abort troligtvis inte en core-fil. Nyttan med att använda egna termineringsfunktioner är relativt marginell. Det vore istället bättre att installera ordentliga excaption-hanterare som fångar alla typer av exceptions före termineringsfunktionen anropas, för att på så vis få en möjlighet att meningsfullt reagera på det som orsakade felet.