Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria Informatica, Gestionale e dellAutomazione
Lezione 8 Gestione delle eccezioni
Fallimenti software Un sistema software può non essere in grado di compiere il suo dovere A causa di errori nella sua implementazione Per limpossibilità di ottenere risorse esterne di cui ha bisogno Non si può rimediare agli errori di programmazione al momento dellesecuzione, salvo cercare di fornire spiegazioni adeguate allutente.
Fallimenti dovuti a cause esterne Un sistema software può avere bisogno di risorse da Hardware Sistema operativo File system Rete Database Utente È possibile che tali risorse non siano disponibili o non siano adeguate
Anomalie ed eccezioni Le eccezioni sono delle anomalie rilevabili al momento dellesecuzione Divisione per 0 Accesso ad un elemento dellarray oltre i suoi limiti Esaurimento della memoria Dato ricevuto in input di un tipo non atteso Quando si verifica un evento eccezionale, la parte di programma che la rileva la può segnalare sollevando (lanciando) uneccezione
Gestione delle eccezioni La gestione delle eccezioni è un meccanismo tramite il quale una parte di un programma può segnalare un problema che verrà gestito altrove In una parte di un programma si verifica un problema che non è in grado di risolvere In unaltra parte del programma si sa come gestire il problema Tramite la gestione delle eccezioni si trasferisce il controllo della gestione degli eventi eccezionali Non è però un meccanismo di controllo come gli altri
Gestione delle eccezioni Espressione throw Segnala la presenza di unanomalia che non si è in grado di gestire localmente Lespressione che segue la parola chiave throw è il tipo dellespressione lanciata Blocco try Definisce un campo dazione locale e racchiude tutte le istruzioni che possono lanciare eccezioni Un blocco try termina con una o più clausole catch che catturano e gestiscono le eccezioni Classi exception Passano informazioni sullerrore da dove viene generato a dove viene gestito
Lancio di eccezioni Uneccezione si lancia con unespressione throw Parola chiave throw seguita da unespressione Alcune eccezioni, ad esempio runtime_exception, sono definite dalla libreria standard in stdexcept Generalmente loperando è un oggetto che rappresenta leccezione È possibile che venga lanciata unespressione anche dal blocco catch In questo caso può essere gestita solo da un blocco try più esterno Uneccezione non è una richiesta di terminazione di un programma Ma uneccezione non gestita causa la terminazione del programma Un throw senza argomenti causa la terminazione immediata del programma Salvo il caso di rilancio di uneccezione
Esempio: lancio di eccezione Razionale::Razionale(int num, int den) { n = num; if (den == 0) throw new runtime_error("il denominatore non può essere 0"); d = den; }
Blocco try try { // codice che potrebbe lanciare eccezioni // es. throw exception; } catch(E1 ex) { // codice che gestisce le eccezioni di tipo E1 } catch(E2 ex) { // codice che gestisce le eccezioni di tipo E2 }
Esempio: cattura di uneccezione con try/catch int main() { try { Razionale r(2, 0); // … } catch(const runtime_error* e) { cerr what() << endl; } return 0; }
Esempio: blocco try di funzione int main(int argc, char *argv[]) try { Razionale r(2, 0); return 0; } catch(const runtime_error* e) { cerr what() << endl; system("PAUSE"); return -1; } Lintero corpo della funzione è contenuto nel blocco try Separazione più netta tra il codice che implementa lelaborazione normale e quello che supporta la gestione delle eccezioni
Cattura di uneccezione I gestori delle eccezioni sono contenuti nei blocchi catch catch (tipoEccezione eccezione) { //… } Cattura le eccezioni il cui tipo corrisponde a tipoEccezione catch(…) Cattura tutte le eccezioni Non conosciamo il tipo delleccezione catturata Non ha parametri, non possiamo referenziare loggetto che rappresenta leccezione
Cattura di uneccezione I catch sono esaminati uno dopo laltro nellordine in cui sono scritti sovraccarico dei catch Un blocco catch corrisponde alloggetto lanciato se Sono dello stesso tipo (corrispondenza esatta) Il parametro è una classe base public delloggetto lanciato Il catch è il catch(…) Gli oggetti const lanciati corrispondono solo a parametri const
Risollevare uneccezione Quando un gestore di uneccezione non è in grado di elaborarla, può rilanciare di nuovo leccezione throw senza argomenti un throw senza argomenti al di fuori di un blocco catch causa la terminazione immediata del programma Uneccezione risollevata può essere ricatturata da un blocco try più esterno
Flusso di controllo di un programma Se non si verifica alcuna eccezione, il codice del blocco try viene eseguito fino alla fine ed il contenuto del blocco catch è ignorato Se viene lanciata uneccezione, lesecuzione delle istruzioni nel blocco try termina e viene eseguita la procedura di gestione delle eccezioni Se esiste un blocco catch per gestire le eccezioni del tipo opportuno, viene eseguito Dopo lesecuzione del blocco catch, lesecuzione prosegue dallistruzione che segue lultimo blocco catch Se non esiste nessun blocco catch in grado di gestire leccezione, lesecuzione riprende dalla funzione terminate() (definita dalla libreria standard del C++ nellheader exception ), che di default chiama abort per terminare lesecuzione del programma
Eccezioni della libreria standard Header exception Definisce exception, il tipo più generico di eccezione, indica solo il fatto che si è verificata uneccezione Header stdexcept exception: il tipo più generale runtime_error: problema che può essere rilevato solo a runtime range_error: il risultano è fuori dal range overflow_error underflow_error logic_errror: problema che avrebbe essere potuto rilevato prima dellesecuzione domain_error: non esiste un risultato per questo valore dellargomento invalid_argument: argomento di tipo non appropriato lenght_error: tentativo di crearo un oggetto di dimensione superiore alla massima consentita out_of_range Header new Definisce bad_alloc, lanciata da new se non riesce ad allocare memoria Header type_info Definisce bad_cast
Eccezioni della libreria standard Exception, bad_alloc, bad_cast hanno solo un costruttore di default Le eccezioni in stdexcept hanno solo un costruttore che prende una stringa di caratteri (messaggio di errore) Hanno solo il metodo const char* what() Restituisce un valore definito dal compilatore (per le eccezioni con costruttore di default) o la stringa passata come argomento al costruttore
Specifica delle eccezioni Una funzione può specificare quali eccezioni può sollevare void int f(int a) throw (E1, E2); specifica che f() può sollevare solo eccezioni di tipo E1 e E2 Se f() dovesse sollevare uneccezione di qualsiasi altro tipo, verrebbe trasformata in std::unexpected() Di default chiama std::terminate() che a sua volta invoca abort() int g() throw(); specifica che g() non solleverà alcuna eccezione double h(double x); può sollevare qualsiasi eccezione