La gerarchia exception
Lo standard prevede tutta una serie di eccezioni, ad esempio l'operatore ::new
puo` sollevare una eccezione di tipo bad_alloc , alcune classi standard
(ad esempio la gerarchia degli iostream ) ne prevedono altre. E`
stata prevista anche una serie di classi da utilizzare all'interno dei propri
programmi, in particolare in fase di debugging.
Alla base della gerarchia si trova la classe exception da cui derivano
logic_error e runtime_error . La classe base attraverso
il metodo virtuale what() (che restituisce un char* )
e` in grado di fornire una descrizione dell'evento (cosa esattamente c'e` scritto
nell'area puntata dal puntatore restituito dipende dall'implementazione).
Le differenze tra logic_error e runtime_error sono
sostanzialmente astratte, la prima classe e` stata pensata per segnalare errori
logici rilevabili attraverso le precondizioni o le invarianti, la classe runtime_error
ha invece lo scopo di riportare errori rilevabili solo a tempo di esecuzione.
Da logic_error e runtime_error derivano poi altre
classi secondo il seguente schema:
|
Le varie classi sostanzialmente differiscono solo concettualmente, non ci sono
differenze nel loro codice, in questo caso la derivazione e` stata utilizzata
al solo scopo di sottolineare delle differenze di ruolo forse non immediate
da capire.
Dallo standard:
logic_error ha lo scopo di segnalare un errore che presumibilmente
potrebbe essere rilevato prima di eseguire il programma stesso, come la violazione
di una precondizione;
domain_error va lanciata per segnalare errori relativi alla
violazione del dominio;
invalid_argument va utilizzato per segnalare il passaggio di
un argomento non valido;
length_error segnala il tentativo di costruire un oggetto di
dimensioni superiori a quelle permesse;
out_of_range riporta un errore di argomento con valore non
appartenente all'intervallo di definizione;
runtime_error rappresenta un errore che puo` essere rilevato
solo a runtime;
range_error segnala un errore di intervallo durante una computazione
interna;
overflow_error riporta un errore di overflow;
underflow_error segnala una condizione di underflow;
Eccetto che per la classe base che non e` stata pensata per essere impiegata
direttamente, il costruttore di tutte le altre classi riceve come unico argomento
un const string& ; il tipo string e` definito nella
libreria standard del linguaggio.
|