Newsgroup: it.comp.java
Titolo: Come si usano le Exception?

Supponiamo di aver fatto bene il lavoro OO:  interfaccia pubblica e
information hiding. In tal caso al cliente non interessa un bel nulla
che il suo fornitore sia incappato in una BackingStoreException o una
IOException o ogni quant'altro. Se il modulo fornitore non ha
mantenuto l'impegno il metodo cliente è interessato solo questo fatto,
a meno di aumentare l'accoppiamento.
Continuando nel ragionamento immagino che allora il fornitore dovrebbe
intercettare con try-catch qualsiasi eccezione che non gli consenta di
portare a termine il suo compito (magari con un printStackTrace) e
rilanciare nello stack una eccezione del tipo "UserRequestFailure", ma
purtroppo nelle API non ho trovato niente di simile.
Non so' nemmeno se il mio problema è di scarsa conoscenzadi java o
dell' OOP. :(

 ha scritto nel messaggio
news:30971c5e.03030...@posting.google.com...

??Scusa? Non ho capito...di che stai parlando?

Se scrivi un metodo "fornitore" che a sua volta usa un metodo tipo
url.openStram() oppure new FileOutputStream(..) puoi ottenre una
eccezione in esecuzione. In Java tale eccezione deve essere
intercettata in un blocco try-catch oppure lasciata risalire nello
stack al metodo chiamante "cliente", e in quest'ultimo caso il metodo
che stai scrivendo lo deve dichiarare esplicitamente (throws
.....Exception).
Se un metodo "cliente" deve usare un metodo "fornitore" entro cui
possono verificarsi delle IOExcpetion o qualcos'altro, nello scrivere
il metodo "fornitore" le alternative credo siano:
Testa nel sacco:
public void myMethod(){
   try{.. operazioni che lanciano eccezioni ..}catch(Exception e){;}
}
Menfreghista:
public void myMethod() throws Exception{
   .. operazioni che lanciano eccezioni ..
}
Responsabile:
public void myMethod() throws UserRequestFailure{
   try{.. operazioni che lanciano eccezioni ..}catch(Exception e){
      ... operazioni sensate per correggere il problema... e/o
      throw new UserRequestFailure();
   }
}
Il mio problema è di tentare di programmare con cura.
Nella OOP uno dei problemi principali è di mantenere basso
l'accoppiamento tra i moduli software (metodi, classi, pakage).
L'accoppaimento tra moduli significa quanto un modulo deve conoscere e
gestire informazioni di dettaglio dell'altro per operare
correttamente. Credo che addirittura esistano delle tecniche per
valutarlo.
La soluzione Testa nel sacco non controlla nulla e perde una
opportunità di Java
La soluzione Menefreghista aumenta l'accoppiamento.
La soluzione Responsabile mi pare la migliore anche se forse non è
sempre da praticare in modo così drastico.
Supponendo di non aver fatto un ragionamento idiota dovrei trovare
nell API una Exception per gestire questa soluzione, ma non la trovo.
Nicola Grippaldi

 nell API una Exception per gestire questa soluzione, ma non la trovo.
Dalla versione 1.4 ogni Throwable puo' avere una 'causa' associata
(cioe' tipicamente una eccezzione di basso livello).
Ad esempio puoi scrivere:
   try {
    lowLevelOp();
   } catch (LowLevelException le) {
    throw new HighLevelException(le);  // Chaining-aware constructor
   }
Comunque leggi con attenzione:
http://java.sun.com/j2se/1.4.1/docs/api/java/lang/Throwable.html
- Dario