Gestione Eccezioni

di il
9 risposte

Gestione Eccezioni

Salve a tutti,
Oggi mi cimento in questo post perché ho un problema da parecchio tempo, ovvero la gestione delle eccezioni. Qualcuno di buona volontà, se è disposto a spiegarmi come funziona l'ordine con cui i catch vengono gestiti e ipotetiche regole aggiuntive come ad esempio se c'è una parte "finally" viene eseguito sempre il finally e poi da esso si prende il primo catch sopra di esso oppure se non c'è almeno un catch è errore a tempo di compilazione etc. Vi lascio giusto un esempio di come lui li propone.. perché io veramente non so come devo ragionare (vi ho lasciato un file allegato della lezione e di come lui lo spiega spero non sia considerato spam, non avevo intenzione di rendere in alcun modo sponsorizzazioni di cose di questo tipo). http://wpage.unina.it/pieroandrea.bonatti/didattica/linguaggi/Lezione15_draft.pdf

Grazie mille in anticipo.
class MyExc1 extends Exception { }
class MyExc2 extends MyExc1 { }
class MyExc3 extends MyExc1 { }

public class A1 {
public static void main(String [] argv)
throws Exception {
try {
System.out.print(1);
m();
}
catch( Exception s ) {
throw( new MyExc2() );
}
catch( MyExc3 v ) {
System.out.print(2);
}
finally {
System.out.print(3);
}
}
static void m()
throws Exception {
try {
System.out.print(4);
throw( new MyExc3() );
}
catch( MyExc2 e ) {
}
catch( MyExc3 d ) {
throw( new Exception() );
}
catch( Exception i ) {
throw( new MyExc1() );
}
}
}

9 Risposte

  • Re: Gestione Eccezioni

    Le dispense sembrano fatte bene.

    La gestione delle eccezioni è uno dei punti più controversi di Java (soprattutto le checked exceptions), è normale che fai fatica.

    Mettiti col debugger su programmi dove generi apposta le eccezioni, e procedi passo passo per vedere quello che succede e in che ordine
  • Re: Gestione Eccezioni

    L'unico metodo risolubile per poter capire il come vengono gestite le eccezioni è questo? non c'è qualche cosa che posso consultare? anche perché col debugger che dovrei fare, metto questo codice d'esempio e poi magari cambio l'ordine delle eccezioni? Perché so che è controverso, ma avendo pure un'esame ed è l'unico argomento che fatico a capire, non vorrei fare cilecca su questo.. sapendo che è anche importante.
  • Re: Gestione Eccezioni

    Dave94 ha scritto:


    Qualcuno di buona volontà, se è disposto a spiegarmi come funziona l'ordine con cui i catch vengono gestiti
    Il file allegato non l'ho letto tutto in dettaglio ma mi pare che spieghi bene (quasi) tutto il necessario.
    C'è un concetto che probabilmente non chiarisce. Un metodo ha sempre solo UNA "ragione" di uscita. O esce per un return (con/senza valore) O esce per una eccezione. Un finally PUÒ cambiare il motivo di uscita e se già prima ce n'era un altro, quello precedente viene ignorato.

    Comunque segui "mentalmente" il flusso del codice e prova a dire cosa succede ... prima di provarlo.
  • Re: Gestione Eccezioni

    Più che altro non riesco a capire se l'ordine di chiamata dipenda dal fatto che tipo chessò se MyExc2 estendesse MyExc1 tipo se magari facendo throw MyExc2 posso comunque catturare tramite un catch di MyExc1 e evitare errori di compilazione. O magari come vedere più visivamente il ragionamento chessò. Io da come ho letto ho solo visto una spiegazione sufficiente ma non compatta per farmi capire in che ordine vengono chiamati... ho visto solo dall'ultimo verso il primo.
  • Re: Gestione Eccezioni

    Il codice comunque non compila .... né main() né m() (entrambi hanno un errore)
  • Re: Gestione Eccezioni

    Si ok, vi ringrazio tanto per l'interessamento nel post e di essere disponibili nell'aiutarmi. Ma cosa dovrei vedere io per capire che non compila.. cioè l'approccio mentale da seguire. Per esempio io adesso vi mostro la mia idea di ragionamento e mi dite fin dove è corretta magari..

    1) i MyExc vabè extendono uno all'altro dove MyExc2-3 estendono MyExc1 che quest'ultimo estende MyExc1 .. tutto apposto.
    2) Entra nel public static void main e vede che c'è una stampa del valore "1" e lo printa.
    3) chiama il metodo m(); e ora passo lì a controllare.
    4) c'è il throws exception e dopo il primo try dove.. lancia MyExc3 e lo può fare
    5) la prima cattura subito dopo che vedo è quella di MyExc2 ma non penso sia concesso perché MyExc2 estende MyExc1
    6) la seconda cattura che vede subito dopo questa è catch di MyExc3 e essendo quella che prima viene lanciata, allora se la prende.
    7) questa poi una volta catturata dentro di sé lancia new MyExc1.

    ...e poi? cioè io per il momento così sto trattando questi..
    il mio docente propone sempre questa variante di esercizi da eseguire un flusso sempre rappresentato così. Ed io sono le uniche cose che diciamo pecco perché non quadro bene il flusso.
  • Re: Gestione Eccezioni

    Dave94 ha scritto:


    Ma cosa dovrei vedere io per capire che non compila.. cioè l'approccio mentale da seguire.
    All'inizio avevo suggerito anche io di seguire "mentalmente" il flusso del codice ma ... non avevo letto il codice nel dettaglio. Poi quando l'ho letto (e riformattato, perché l'hai postato non ben indentato) mi è risultato ben chiaro che NON compila.

    Non compila perché sia in main() che in m() c'è un errore che sostanzialmente viola le regole sulle eccezioni.

    Punto a) nel main(): ti sembra giusto prima un catch di Exception e poi seguito da un catch di MyExc3??

    Punto b) nel m(): ti sembra giusto che ci sia un catch di MyExc2? (cosa c'è dentro il catch NON importa)
  • Re: Gestione Eccezioni

    In merito al punto a) sostieni questa affermazione perché se avesse dovuto avere senso doveva stare Exception come ultimo catch in quanto il più generale di tutti gli altri Exception ?
    in merito al punto b) non ho capito perché.. cioè è errore se sta messo lì perché non fa nulla o perché in linea gerarchica non ha senso perché Exc2 non estende Exc3 (?)
  • Re: Gestione Eccezioni

    Dave94 ha scritto:


    se avesse dovuto avere senso doveva stare Exception come ultimo catch in quanto il più generale di tutti gli altri Exception ?
    Sì, la questione è quella. L'ordine dei catch è significativo SE ci sono due o più eccezioni da gestire che sono in relazione di ereditarietà. Una eccezione più specifica DEVE essere catchata prima di una meno specifica (più generica).
    Quindi prima il catch di MyExc3 (più specifica) poi il catch di Exception (più generica).

    Se due o più eccezioni sono completamente slegate, l'ordine non conta (es. IOException e SQLException, entrambe derivano da Exception ma tra di loro non sono in relazione quindi puoi catturare prima una o l'altra, a scelta).

    P.S. la dispensa Lezione15_draft.pdf accenna solo in parte questa questione a pagina 7.

    Dave94 ha scritto:


    cioè è errore se sta messo lì perché non fa nulla o perché in linea gerarchica non ha senso perché Exc2 non estende Exc3 (?)
    No, non conta il fatto che non contiene codice, né la ereditarietà.
    Molto più semplice: guarda bene il try, c'è qualcosa lì dentro che potrebbe lanciare MyExc2?? Risposta ovvia: no.

    Il compilatore SA (lo scopre) che non è possibile che il try lanci MyExc2. Se fosse possibile lanciarla, allora ci dovrebbe essere o un throw fisso di MyExc2 oppure un metodo che dichiara MyExc2 (perché essendo MyExc2 "checked" il metodo sarebbe obbligato a dichiararla).

    Per il compilatore è un errore mettere un catch di una eccezione checked se poi il try NON la può lanciare. Il codice nel catch sarebbe un unreachable code, non raggiungibile, non verrebbe mai eseguito. E appunto è un errore per le regole di Java.

    Anche java.lang.Exception è tecnicamente "checked" ma fa anche da base per RuntimeException ("unchecked"), quindi è esentata dal discorso appena fatto (cioè PUOI fare un catch di Exception anche se poi nel try NON c'è nulla che possa lanciare qualcosa che è-un Exception).
Devi accedere o registrarti per scrivere nel forum
9 risposte