C++-manual
Förutgående | Kapitel 20. Exceptions | Nästa

# 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.

Förutgående | Hem | Nästa
Använda exceptions | Upp | Hierarkier med exceptions