Newsgroup: it.comp.java
Titolo: eccezioni e Thread

Ho una classe che estende Thread, e voglio che propaghi un'eccezione al 
chiamante...
ma non posso aggiungere la clausola 'throws' al metodo ereditato 'public 
void run()' perche' l'ereditarietà non me lo permette.
Come si fa in questi casi?
E' una domanda stupida ma non mi ero mai posto questo problema...
Grazie!
Marco 

 E' una domanda stupida ma non mi ero mai posto questo problema...
Mah, io passerei al costruttore della tua classe che estende Thread 
un'implementazione di una interfaccia, che so, ExceptionHandler in grado di 
gestire l'eccezione: basta che il chiamante implementi ExceptionHandler e 
sei a posto.
Ciao,
Scorpio.

 e sei a posto.
Scusami, non credo di aver capito!
Come faccio gestire l'eccezione ad un ExceptionHandler?
Potresti farmi un esempio?
Grazie mille!
Marco 

 ha scritto nel messaggio 
news:47a48139$0$36450$4faf...@reader5.news.tin.it...
[cut]
Per ora ho risolto passando al costruttore del Thread un Vector, facendogli 
aggiungere l'esito delle operazioni eseguite (FAIL in caso di eccezione, OK 
altrimenti), ma non mi sembra un metodo molto elegante, oltre ad essere 
parecchio sbrigativo :-/
Marco 

 Come si fa in questi casi?
premesso che l'eccezione non si propaga fra thread quindi questa strada 
è un cul de sac, la domanda sorge spontanea: cosa vuoi fare?
-- 
Fino all'anno scorso avevo un solo difetto. Ero presuntuoso.
http://softvalley.blogspot.com

 un cul de sac, la domanda sorge spontanea: cosa vuoi fare?
Forse cerco di fare ciò che concettualmente è sbagliato ;-)
Questo thread accede ad un oggetto remoto (RMI) che puo' lanciare delle 
eccezioni irrecuperabili (cioè non avrebbe senso un try catch).
Io voglio che siano propagate "così come sono" fino al main del Client.
Cosa sbaglio?
Marco 

 ha scritto nel messaggio 
news:47a48139$0$36450$4faf...@reader5.news.tin.it...

Farei cosě, grossolanamente:
interface ExceptionHandler {
    public void handleException(Exception e);
}
class A extends Thread {
        ExceptionHandler handler = null;
        public  A (ExceptionHandler handler) {
            //...
            this.handler = handler;
        }
        public void run() {
            try
            {
                // corpo del metodo
            }
            catch(Exception e) {
                    handler.handleException(e);
            }
        }
}
public class Chiamante implements ExceptionHandler{
        ////
        A myThread = new A(this); // le eccezioni saranno gestite da 
Chiamante
                                                  // attraverso il metodo 
handleException
}
Saluti,
Scorpio. 

 ha scritto nel messaggio 
news:47a49299$0$17950$4faf...@reader1.news.tin.it...

Mah, direi che non è un gran che se l'eccezione arriva fino al main, una 
volta che ci arriva
che ci fai ? Immagino che se invochi un metodo remoto con RMI stai, in 
pratica, chiamando
un servizio: non ti serve un retry ?
Meglio un gestore di eccezioni, naturalmente più sofisticato di quello che 
ho buttato giù nell'altro post.
Scorpio. 

 ho buttato giù nell'altro post.
Sono comunque d'accordo, e la tua mi sembra un'ottima soluzione (ora ho 
capito cosa intendevi)... grazie mille!
Marco 


Prego !
Scorpio. 

 Io voglio che siano propagate "così come sono" fino al main del Client.
come ho detto non puoi propagare l'eccezione da un thread all'altro.
puoi comunicare fra thread in modo sincrono utilizzando il wait() e il 
notify(). oppure puoi farlo in modo asincrono per esempio gestendo una 
coda di messaggi.
