Gestione delle eccezioni

Documenti analoghi
Gestione di errori e situazioni eccezionali. Gestione delle eccezioni. Gestione tradizionale di errori e situazioni eccezionali (2)

Le eccezioni in Java

Le eccezioni in Java

19 - Eccezioni. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Eccezioni. Corso di Programmazione CdS: Informatica e Tecnologie per la Produzione di Software Nicola Fanizzi.

Programmazione ad Oggetti

Eccezioni. Comportamento di default (esempio) Propagazione delle eccezioni

Laboratorio di reti I

Programmazione ad oggetti

Java: costrutti avanzati

FONDAMENTI DI INFORMATICA C Linguaggio Java: Eccezioni

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

RETI DI CALCOLATORI Linguaggio Java: Eccezioni

Gestione delle eccezioni in Java

GESTIONE DEGLI ERRORI

GESTIONE DEGLI ERRORI

Programmazione a Oggetti. Eccezioni

Insegnamento di Laboratorio di algoritmi e strutture dati

Progettazione del Software

Eccezioni predefinite

Le eccezioni in Java

Eccezioni per codificare errori. Eccezioni. Gestione di eccezioni. lancio di eccezioni. checked e unchecked. cattura di eccezioni

Fondamenti di Informatica

Eccezioni in Java A. FERRARI

La gestione delle eccezioni

Le eccezioni in Java

Eccezioni. Programmazione in rete e laboratorio Eccezioni. Classi eccezioni

Agent and Object Technology Lab Dipartimento di Ingegneria dell Informazione Università degli Studi di Parma. Ingegneria del software A

Gestione degli Errori in Java. Emilio Di Giacomo e Walter Didimo

Programmazione. Cognome... Nome... Matricola... Prova scritta del 20 febbraio 2012

LE ECCEZIONI. Dott. Riccardo Zese.

OOP: L13: Eccezioni e loro trattamento in Java

Le basi del linguaggio Java

Programmazione a Oggetti Lezione 11. Eccezioni e Packages

Java fornisce una ricca gerarchia di classi di eccezioni: Object

Esercitazione 2. Java:

PROGRAMMAZIONE 2 6a. Eccezioni in Java

Gli errori nei programmi si verificano Quello che è realmente importante è: cosa fare dopo che un errore si è verificato?

Il linguaggio Java. Le eccezioni

Laboratorio di Programmazione II Corso di Laurea in Bioinformatica Dipartimento di Informatica - Università di Verona

GESTIONE DEGLI ERRORI. Il gestore delle eccezioni

Eccezioni e Thread (cenni)

OCA JAVA 7 SE PROGRAMMER I DOCENTE: DOTT. FAUSTO DELL ANNO

PROGRAMMAZIONE 2 6a. Eccezioni in Java

Prova d Esame Compito A

Laboratorio di Programmazione Lezione 2. Cristian Del Fabbro

Gestire le situazioni di errore

Dal libro di Savitch & Carrano

Programmazione a oggetti

Note ed esercizi aggiuntivi

Astrazione procedurale

Gestione delle Eccezioni

Programmazione a Oggetti e JAVA. Prof. B.Buttarazzi A.A. 2012/2013

Gestire le eccezioni. Lezione XI

Programmazione. Cognome... Nome... Matricola... Prova scritta del 11 luglio 2014

Cast implicito. Il cast è fatto automaticamente quando un tipo più basso viene assegnato ad un tipo più alto. byte short int long float double

COGNOME NOME MATRICOLA DATA

Programmazione. Cognome... Nome... Matricola... Compitino del 26 gennaio 2009

Gestione delle eccezioni

Progettazione del Software

Programmazione. Cognome... Nome... Matricola... Compitino del 17 gennaio 2007

Il linguaggio Java. Le eccezioni

8. Java: Eccezioni e Thread

ASD: Sistemi Distribuiti (Prof. Scarano) 24/04/2002

Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A Gestione delle eccezioni in Java

Programmazione. Cognome... Nome... Matricola... Prova scritta del 22 settembre Negli esercizi proposti si utilizzano le seguenti classi:

Input. Il tipo char Alcune modalità di acquisizione di input. Laboratorio di Programmazione - Luca Tesei

Prova d Esame Compito A

METODI in Java. Prof.Angela Bonifati. Metodi e Sottoprogrammi

7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari

Gestione delle Eccezioni

LETTURA DI DATI DA INPUT. Gli stream di byte consentono già di leggere dati (numeri di vario tipo), tramite la classe DataInputStream

Passaggio dei parametri

Le eccezioni. Eccezioni

Gestione degli errori

Unità A1 Funzioni MODULO Java 2

Prova d Esame Compito A

Gestione delle eccezioni

Inizializzare oggetti

Eccezioni. Corso di Tecniche di Programmazione

Soluzione della prova scritta del 5 febbraio 2013

import java.io.*; char sceltautente = '_'; boolean condizionesn = true; boolean condizionedowhile = true; boolean condizioneprogramma = true;

Capitolo 13: Gestione delle eccezioni. Capitolo 13. Gestione delle eccezioni Apogeo srl Horstmann-Concetti di informatica e fondamenti di Java 2

System.out.print("\tATTENZIONE: hi inserito un valore non valido!\n");

Le eccezioni sono eventi che si generano durante l esecuzione di un programma e in genere corrispondono a condizioni anomale.

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

Gestione delle Eccezioni

Eccezioni ed asserzioni

Concetti Base Eccezioni Eccezioni e Metodi Gerarchia di Eccezioni. Java: Eccezioni. Damiano Macedonio

Uguaglianza e copia di oggetti

Scelte. Costrutto condizionale. Il costrutto if. Il costrutto if. Rappresentazione con diagramma a blocchi. Il costrutto if

Programmazione I - corso B a.a prof. Viviana Bono

Università Ca Foscari DAIS. Programmazione ad Oggetti. Esame del modulo 1

Gestione delle eccezioni Individuazione e ripristino parseint Individuazione e ripristino Individuazione e ripristino parseint

Transcript:

Gestione delle eccezioni

Gestione di errori e situazioni eccezionali Una procedura (utente o di libreria) deve poter segnalare l impossibilità di produrre un risultato significativo o la propria terminazione scorretta Esempi: apertura di un file (ma il file non esiste) Calcolo radice quadrata di un numero (ma il numero è negativo) 2

Gestione tradizionale di errori e situazioni eccezionali (1) terminare il programma è soluzione comune ma spesso troppo drastica Es. apertura di un file il cui nome non esiste: probabilmente si può segnalare il problema e continuare l esecuzione Es. razzo vettore Ariane 5 nel 96 distrutto per casting da float a int che diede errore a run time a rigore è una scelta che spetta al chiamante e non al chiamato: solo chi ha chiamato una certa operazione puo decidere se si può continuare (ad esempio correggendo l errore) oppure interrompere l esecuzione. Il chiamato non può deciderlo 3

Gestione tradizionale di errori e situazioni eccezionali (2) restituire un valore convenzionale che rappresenti l errore Es. fopen in C cerca di aprire un file e restituisce un intero fact(x) potrebbe ritornare un valore negativo per x<0 può non essere fattibile perché la procedura non ha un valore di ritorno o perché qualsiasi valore di ritorno è ammissibile in generale dà poche informazioni riguardo l errore incontrato condiziona il chiamante non posso scrivere espressioni del tipo z = x + fact(y) devo scrivere: int r = fact(y); if (r>0) z = x + r; else... il chiamante può dimenticarsi di verificare il valore ritornato (es. fopen) 4

Gestione tradizionale di errori e situazioni eccezionali (3) Portare il programma in uno stato scorretto Si usa una variabile globale ERROR la procedura chiamante potrebbe non accorgersi che il programma è stato portato in uno stato "scorretto (dovrebbe verificare ERROR ogni volta che chiama una procedura o esegue un operazione che potrebbe dare errore) oppure usare di una funzione predefinita per la gestione degli errori Es. si chiama una funzione ERROR(...) diminuisce la leggibilità del programma centralizza la gestione degli errori (che spetterebbe al chiamante) ripristino difficoltoso 5

Gestione delle eccezioni Soluzione: gestione esplicita delle eccezioni a livello di linguaggio una procedura può terminare normalmente (con un risultato valido) o sollevare un eccezione Un eccezione e un oggetto speciale restituito dalla funzione le eccezioni vengono segnalate al chiamante che può gestirle le eccezioni hanno un tipo (Classe) Es. DivisionByZeroException, NullPointerException Le eccezioni possono contenere dati che danno indicazioni sul problema incontrato. le eccezioni possono essere definite dall utente (personalizzazione) 6

Uso delle Eccezioni in Java Gestire le eccezioni Un'eccezione può essere catturata e gestita attraverso il costrutto: try {<blocco> catch(classeeccezione e) {<codice di gestion> try{ x = x/y; catch (DivisionByZeroException e){ //e e l oggetto eccezione //codice per gestire l eccezione //Qui è possibile usare e //istruzione successiva, da eseguire se non c e stata eccezione o se //catch è riuscito a recuperare 7

Esempio: I/O Lettura da Input in Java richiede gestione eccezioni public static void main(string[] arg[] { BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); //def. stream di ingresso try{ System.out.print("Enter a line:"); System.out.println(stdin.readLine()); catch(ioexception e) { System.out.println("IO Exception"); System.out.println( Continuo, con o senza eccezione"); la readline() può generare eccezione ( IOEXception ) se si verifica eccezione facendo readline(), si salta al catch. Se eccezione è del tipo IOException si esegue il codice, altrimenti il programma termina. Eseguito il catch si prosegue con l'istruzione successiva al catch (non c'e' ripristino). 8

Più rami catch Un ramo catch(ex e) può gestire un eccezione di tipo T se T è di tipo Ex o T è un sottotipo di Ex Più clausole catch possono seguire lo stesso blocco try: ciascuna cattura l eccezione del proprio tipo... try{ int y = Integer.parseInt(stdin.readLine()); x = x/y; catch (ArithmeticException e){ //qui cattura tutte le eccezioni aritmetiche, inclusa DivisionByZero catch (IOException e) {... 9

Uso delle Eccezioni in Java Propagazione delle eccezioni Se invocando una procedura si verifica un'eccezione: si termina l esecuzione del blocco di codice in cui si è verificata l eccezione e... se il blocco di codice corrente è un blocco try/catch ed esiste un catch in grado di gestire l eccezione, si passa il controllo al primo di tali rami catch e, completato questo, alla prima istruzione dopo il blocco. altrimenti si risalgono eventuali blocchi di codice più esterni fino a trovare un blocco try/catch che contenga un ramo catch che sia in grado di gestire l eccezione, altrimenti... l eccezione viene propagata nel contesto del chiamante la propagazione continua fino a che si trova un blocco try/catch che gestisce l eccezione se tale blocco non si trova, il programma termina 10

Flusso in presenza di eccezioni Flusso: main attivato blocco 1 main block1 block2 proc2 block3 blocco 2 proc1 invocata proc2 invocata call to proc1 block4 blocco 3 blocco 4... eccezione! propagazione dell eccezione! proc1 call to proc2 throw exception block5 11

Il ramo finally Un blocco try/catch può avere un ramo finally in aggiunta a uno o più rami catch Il ramo finally è comunque eseguito sia che all interno del blocco try non vengano sollevate eccezioni sia che all interno del ramo try vengano sollevate eccezioni gestite da un catch. In tal caso il ramo finally viene eseguito dopo il ramo catch che gestisce l eccezione sia che all interno del blocco try vengano sollevate eccezioni NON gestite da un catch Tipico esempio: essere sicuri in uscita di chiudere un file, sia che ci sia o che non ci sia un errore class Prova { static void read(string filename) { try{ FileInputStream f=new FileInputStream(fileName);... // use f catch(ioexception ex) {... finally {f.close(); 12

Progettare procedure con eccezioni E possibile definire procedure e metodi che costruiscono eccezioni e le restituiscono al chiamante. Il fatto che una procedura possa terminare sollevando un eccezione è dichiarato nella sua interfaccia per mezzo della clausola throws Utilità: segnalare un comportamento anomalo incontrato durante l esecuzione di un istruzione public static int leggiinterodainput () throws IOException notificare che una precondizione su un operazione è stata violata public static int fact (int n) throws NegativeException restituire un valore convenzionale public static int search (int[] a, int x) throws NullPointerException, NotFoundException //EFFECTS: restituisce la posizione di a, se esiste, dove si trova x 13

Sollevare eccezioni Per sollevare esplicitamente un'eccezione, si usa il comando throw, seguito dall oggetto (del tipo dell eccezione) da lanciare al chiamante Semantica (informale) del comando throw termina l esecuzione del blocco di codice che lo contiene, generando un'eccezione del tipo specificato public static int fact (int n) throws NegativeException{ if (n<0) throw new NegativeException(); else if (n==0 n==1) return 1; else return (n * fact(n-1)); 14

Uso delle Eccezioni in Java Tipi di eccezioni Eccezioni definite tramite classi, sottotipo del tipo Throwable Esistono due tipi di eccezioni: eccezioni checked sottotipo di Exception eccezioni unchecked sottotipo di RuntimeException Error Throwable Exception RuntimeException (checked exceptions) (unchecked exceptions) 15

Uso delle Eccezioni in Java Eccezioni checked e unchecked Eccezioni checked devono essere dichiarate dalle procedurache possono sollevarle (altrimenti si ha un errore a compile-time) quando una procedura P1 invoca un altra procedurap2 che può sollevare un eccezione di tipo Ex (checked), una delle due seguenti affermazioni deve essere vera: l invocazione di P2 in P1 avviene internamente ad un blocco try/catch che gestisce eccezioni di tipo Ex (quindi, P1 gestisce l eventuale eccezione) il tipo Ex (o un suo sopra-tipo) fa parte delle eccezioni dichiarate nella clausola throws della procedura P1 (quindi, P1 propaga l eventuale eccezione) Eccezioni unchecked possono propagarsi senza essere dichiarate in nessuna signature di procedura e senza essere gestite da nessun blocco try/catch Può essere meglio includerle comunque in throws, per renderne esplicita la presenza (ma per il compilatore e irrilevante) 16

Uso delle Eccezioni in Java Definizione di nuove eccezioni Gli oggetti di un qualunque tipo T definito dall utente possono essere usati per sollevare e propagare eccezioni, a condizione che T sia definito come sotto-tipo della classe Exception (o RuntimeException) La definizione della classe che descrive un eccezione non differisce dalla definizione di una qualsiasi classe definita dall utente. In particolare può possedere attributi e metodi propri (usati per fornire informazioni aggiuntive al gestore dell eccezione) (v. ereditarietà!!) Definizione public class NewKindOfException extends Exception { public NewKindOfException(){ super(); public NewKindOfException(String s){ super(s); I due costruttori richiamano semplicemente i costruttori di exception uso: throw new NewKindOfException( problema!!! ) gestione: try{...catch(newkindofexception ecc){ String s = ecc.tostring( ); System.out.printls(s); 17

Esempio: eccezioni con un costruttore public class ProvaEcc { public static void main(string[] args) { int g,m,a;... // leggi g, m, a try {d=new Data(g,m,a); catch(data.dataillegale e) { System.out.println("Inserita una data illegale"); System.exit(-1); public class Data { private int giorno, mese, anno; private boolean corretta(int g,int m,int a) {... public class DataIllegale extends Exception {;//inner class public Data(int g, int m, int a) throws DataIllegale { if(!corretta(g,m,a)) throw new DataIllegale(); giorno=g; mese=m; anno=a; 18

Progettare le eccezioni Uso delle eccezioni segnalare un comportamento anomalo incontrato durante l esecuzione di un istruzione notificare che una precondizione su un operazione è stata violata restituire un valore convenzionale Le eccezioni unchecked dovrebbero essere evitate il più possibile. Il loro uso dovrebbe essere limitato ai casi in cui: 1. Si tratta di eccezioni titipo aritmetico/logico 2. c è un modo conveniente e poco costoso di evitare l eccezione 1. Es. le eccezioni aritmetiche: posso sempre, se mi serve, controllare prima di eseguire il calcolo 2. Es: per gli array, le eccezioni di tipo OutOfBoundException possono essere evitate controllando in anticipo il valore dell attributo length dell array 3. l eccezione è usata solo in un contesto ristretto Meglio dichiararle comunque in throws quando un metodo le può lanciare 19

Programmare con le eccezioni: masking Dopo la gestione dell eccezione, l esecuzione continua seguendo il normale flusso del programma (eccezione è gestita e non si propaga al chiamante) Esempio tipico: eccezione usata per verificare una condizione. public static boolean sorted (int[] a) { int prev; try { prev=a[0]; //lancia eccezione se array e vuoto //(era meglio check diretto su a) catch (IndexOutOfBoundsException e){ return true; for (int i=1; i<a.length; i++) { if (prev <= a[i]) prev=a[i]; else return false; return true; 20

Programmare con le eccezioni: propagazione (o reflecting ) La gestione dell eccezione può comportarela propagazione di un ulteriore eccezione (dello stesso tipo o di tipo diverso) Esempio tipico: un eccezione all interno del codice deve essere tradotta in un eccezione comprensibile al chiamante. public static int min (int[] a) throws NullPointerException, EmptyException{ int m; try { m=a[0]; catch (IndexOutOfBoundsException e){ throw new EmptyException( Arrays.min ); for (int i; i<a.length; i++) if (a[i] < m) m=a[i]; return m; 21

Consigli Utili aggiungere ai dati correlati con l eccezione l indicazione della procedura che l ha sollevata (in modo da facilitare l individuazione delle cause) public static int fact (int n) throws NotFoundException{... throw new NotFoundException( fact );... nel caso in cui la gestione di un eccezione comporti un ulteriore eccezione (reflecting), conservare le informazioni catch (NotFoundException e){ throw new NewKindOfException( procedure.name + e.tostring()); sebbene sia possibile scegliere liberamente i nomi delle nuove eccezioni definite, è buona convenzione farliterminare con la parola Exception NotFoundException piuttosto che NotFound Può essere talvolta utile prevedere un package contenente tutte le nuove eccezioni definite (migliora la struttura del progetto e facilita il riuso delle eccezioni). A volte invece conviene definire eccezioni come inner classes 22