130 likes | 262 Views
Eccezioni. Eccezioni: Usi e Metodi parziali Eccezioni: rimuovere i requires Eccezioni: definizione, sollevamento, gestione Cattura: mascheramento o riflessione Eccezioni: regole d’uso Defensive programming : Checked vs. Unchecked Esempi: fattoriale, LList, compressione di files.
E N D
Eccezioni Eccezioni: Usi e Metodi parziali Eccezioni: rimuovere i requires Eccezioni: definizione, sollevamento, gestione Cattura: mascheramento o riflessione Eccezioni: regole d’uso Defensive programming: Checked vs. Unchecked Esempi: fattoriale, LList, compressione di files
Eccezioni: usi • Funzioni parziali • domini • Gestione di eventi • thread e concorrenza • Catastrofi • errori incontrollabili Scopo: Garantire una terminazione “regolare” del programma (stato finale appartiene agli stati consentiti per la terminazione)
Metodi parziali Tre cause principali: • Realizza funzione parziale • fattoriale • Implementazione utilizza funzioni parziali • algoritmi di ricerca (possono richiedere strutture ordinate) • Strutture sovradimensionate per lo spazio dei valori del dominio • fattoriale: Naturali invece di interi
Eccezioni: rimuovere i requires Eccezioni: • Non sono speciali valori del dominio di definizione del metodo parziale • Sono trattabili come fossero valori di un dominio particolare del linguaggio • In JAVA formano una gerarchia di classi Throwable Error Exceptions RuntimeException unchecked Class checked Class checked NullPointerException ClassCastException
Eccezioni: definizione, sollevamento, gestione Introducono: come normali valori oggetto • new A_ExceptionClass(…)// un valore eccezione checked • new NullPointerException(“insert”)// un valore eccezione unchecked Definiscono: gerarchia di classe Exception public class NoIntegerException extends Exception{ //OVERVIEW: contiene eccezioni che segnalano uso, come oggetti Integer, // di oggetti che non hanno Integer come superclasse public NoIntegerException(){ super(); } public NoIntegerException(String s){ super(s); } } Spesso non hanno stato
Eccezioni: come si usano? • come valori A_ExceptionClass e;// una variabile x e = new A_ExceptionClass (…)// un assegnamento • in metodi che le possono sollevare void luigi (object x) throws A_ExceptionClass {…}// un metodo public int fact (int x) throws NegativeInt {…}// un metodo • gestiti: • Cattura • Mascheramento • Risollevamento
Cattura: Mascheramento o Riflessione • Cattura: • Sia C un blocco che può sollevare un’eccezione di classe A • try {C} catch (A v) {..trattamento eccezione associata a v..} • Mascheramento: • eccezione è risolta • blocco calcola valore non eccezione • Riflessione: • eccezione non è risolta • blocco risolleva tale eccezione • Oppuresolleva una nuova eccezione • Sollevare eccezione richiede il costrutto • throw expr • dove expr ha valore un’eccezione
Eccezioni: regole d’uso(Implementazione di una parziale) • Uso locale - funz. privata di una classe • Lasciamo la clausola requires • Verifichiamo che nessun uso violi i requires (la verifica è possibile) • Uso non locale - funz. pubblica del sistema • Rimuoviamo la clausola requires • Introduciamo opportuna classe Exception (se non presente) • Equipaggiamo il metodo con controlli sull’imput e con sollevamento di eccezione in violazione • Consideriamo ogni uso (nel sistema) del metodo per cattura-mascheramento-riflessione
Defensive Programmingogni procedura controlla di non generare errori • Checked: • Introdotte nel programma --poste in un package dedicato • Mediante classi della gerarchia • obbligatorio dichiarare ogni metodo che le può sollevare • Mediante: …. throws ExceptionClass… • Vantaggio: gestione esplicita dell’eccezione -- mascheramento • Uso suggerito: metodi parziali in contesto non locale • Unchecked: • Introdotte nei pakages di linguaggio • Nessun obbligo di dichiarare metodi che le sollevano • Vantaggio: gestione automatica -- riflessione • Uso suggerito: • metodi parziali in contesto locale (o non) ma eccezione non sollevabile -- invocazioni possibili non la provocano • catastrofi -- comportamento non previsto e inatteso
Esempio: Eccezioni in Fact public class Fattoriale{ //overview: una classe per la procedura stand_alone fatt che calcola la funzione fattoriale public static int fact(int n) throws NegativeIntException{ //Effects: se n = 0 calcola 1, se n>0 calcola n*fact(n-1), altrimenti solleva un // eccezione NegativeIntException if (n < 0) throw new NegativeIntException(”Fattoriale:fact”); if (n == 0) return 1; return n*fact(n-1);} } public class NegativeIntException extends Exception{ //overview: una classe per eccezioni su interi negativi public NegativeIntException(String s){ //Effects: costruisce un eccezione sollevata in un contesto s super(s);} }
Esempio: Eccezioni in Fact - 2 public class Fattoriale{ //overview: una classe per la procedura stand_alone fatt che calcola la funzione fattoriale public static int fact(int n) throws NegativeIntException{ //Effects: se n = 0 calcola 1, se n>0 calcola n*fact(n-1), altrimenti solleva un // eccezione NegativeIntException specificando il valore errato if (n < 0) throw new NegativeIntException(”Fattoriale:fact”, n); if (n == 0) return 1; return n*fact(n-1);} } public class NegativeIntException extends Exception{ //overview: una classe per eccezioni su interi negativi che tiene traccia del valore errato private Int val; public NegativeIntException(String s, Int n){ //Effects: costruisce un’eccezione sollevata in un contesto s con valore n super(s); val=n;} public Int value(){ //Effects: restituisce il valore errato return val;} }
public class LList { private Link first; private class Link { Object data; Link next; } … public Object getFirst() { if (first == null) return null; else return first.data; } … public void addFirst(Object obj) { Link newLink = new Link(); newLink.data = obj; newLink.next = first; first = newLink; } … Esempio: LList public class LList{ //overview: … //---stato: oggetti-classe public Object getFirst() throws EmptyListException{ //Effects: se this è empty solleva eccezione, altrimenti restituisce // il primo elemento di this. if (first == null) throw new EmptyListException(); … public void addFirst(Object obj) throws NullPointerException{ //Effects: se Obj è null solleva eccezione, altrimenti …. if (obj == null) throw new NullPointerException(); … public class EmptyListException extends Exception{ //overview: una classe per eccezioni su LList public EmptyListException(){ //Effects: costruisce un’eccezione di tipo EmptyListExeption } public class NullPointerException extends RunTimeException{ //overview: una classe per eccezioni su oggetti null public NullPointerException(){ //Effects: costruisce un’eccezione NullPointerException }
Esempio: Compress(Fin,Fout) public class Compress{ //OVERVIEW: contiene la procedura compress. public static void compress(File FIn, File FOut) throws UndefFileException, IllegalSymbol, FileNotFoundException{ //MODIFIES: FOut //EFFECTS: Se FIn o FOut è null solleva un’eccezione della nuova classe UndefFileException, sottoclasse di Exception, con // testo: "compress:argK" (con K=1 o K=2, rispetttivamente). Se FIn o FOut non sono nomi di file solleva eccezione prede- // finita FileNotFoundException. Altrimenti, fintanto che legge da FIn sequenze di lettere su più linee, le filtra (eliminando gli // spazi in eccesso) preservando la disposizione in linee. Allorché incontri un carattere non lecito (non lettera, non speciali "\b", // "\n”), termina chiudendo il file FOut e sollevando un'eccezione della nuova classe IllegalSymbolException, sottoclasse di // Exception, con testo: "compress:C (con C il carattere illegale letto). BufferedReader FInBuff if (Fin == null) then throw (new UndefFileException(“compress: arg1”));} try{FInBuff = OpenReader(FIn);}catch(FileNotFoundException e){throw (new FileNotFoundException(“compress: arg1”));} PrintStream FOutPrinter = OpenPrinter(FOut); // ---- specifica violata: modificare qui while (true) {String line; try { line = FInBuff.readLine(); } catch (java.io.IOException e) {return; } if (line == null) {return; } else {String out; try { out = Filter(line); } catch (IllegalSymbol e) { FOutPrinter.println(e.line); throw (new IllegalSymbol(e.symbol)); } FOutPrinter.println(out); FOutPrinter.flush(); }}} private static BufferedReader OpenReader(File FIn) throws UndefFileException, FileNotFoundException { //EFFECTS:.. private static PrintStream OpenPrinter(File FOut) throws UndefFileException, FileNotFoundException { //EFFECTS:.. private static String Filter(String line) throws IllegalSymbolException { //EFFECTS:..