PDA

View Full Version : [JAVA] catturare eccezioni generate in un thread


redcloud
16-10-2006, 17:16
Salve, volendo realizzare un banale programmino seguendo il modello MVC, ho la necessita di catturare (nella VISTA) un'eccezione generata dal CONTROLLO (che è un thread a se) ma non riesco a farlo. Probabilmente il mio approccio è sbagliato oppure devo usare un trick? L'eccezione viene generata ovviamente nel metodo run() del thread e al momento l'unico modo per far visualizzare un messaggio di errore nella VISTA è quello di farlo direttamente nel run() del thread e non in seguito nella VISTA dopo che il thread ha lanciato un'eccezione. Mi sembra un po' sporca come soluzione ma il metodo run() non permette di rilanciare eccezioni... che ne dite?

Gatz1980
16-10-2006, 18:51
Salve, volendo realizzare un banale programmino seguendo il modello MVC, ho la necessita di catturare (nella VISTA) un'eccezione generata dal CONTROLLO (che è un thread a se) ma non riesco a farlo. Probabilmente il mio approccio è sbagliato oppure devo usare un trick? L'eccezione viene generata ovviamente nel metodo run() del thread e al momento l'unico modo per far visualizzare un messaggio di errore nella VISTA è quello di farlo direttamente nel run() del thread e non in seguito nella VISTA dopo che il thread ha lanciato un'eccezione. Mi sembra un po' sporca come soluzione ma il metodo run() non permette di rilanciare eccezioni... che ne dite?
Beh, se stai usando il modello MVC per un'applicazione web e vuoi essere j2ee compliant, non dovresti nemmeno usare dei thread creati da te, ma piuttosto degli ejb.

redcloud
16-10-2006, 18:59
No no è un'applicazione classica non web!

Gatz1980
16-10-2006, 19:15
In ogni caso, non mi è chiaro l'approccio e l'architettura che vuoi usare. Come fai ad invocare un servizio sul controller se è un thread?

PGI-Bis
16-10-2006, 19:52
A partire da Java 5, poi associare ad un Thread (o a un ThreadGroup o impostarne uno per tutti) un Thread.UncaughtExceptionHandler. Se è generata un'eccezione e quell'eccezione non è intercettata, finisce nel metodo uncaughtException dell'handler. Non so però se questo possa esserti utile.

redcloud
16-10-2006, 22:38
In ogni caso, non mi è chiaro l'approccio e l'architettura che vuoi usare. Come fai ad invocare un servizio sul controller se è un thread?

Dalla VISTA io chiamo il CONTROLLO "somma sti numeri naturali e dammi il risultato". Il CONTROLLO verifica che i numeri passati siano natuali altrimenti genera un'eccezione. Il messaggio contenuto nell'eccezione sollevata ("aò vedi che m'hai dato tutto tranne che numeri naturali") deve essere inviato alla VISTA (che si occupa di visualizzare una Finestra di errore). A questo punto le soluzioni sono 2: o il CONTROLLO chiama direttamente la funzione contenuta in VISTA che fa visualizzare la finestra col messaggio generato dall'eccezione oppure il CONTROLLO invia il messaggio e la VISTA si occupa di chiamare il suo metodo per visualizzarlo. L'eccezione è il modo più corretto di inviare questo messaggio MA il controllo è un thread, e un thread vive nel ciclo di vita del suo unico metodo public void run() il quale non throws nessuna eccezione. Quindi con i thread il tutto si riduce alla soluzione 1 o ad altre ancora più sporche. Ma con il suggerimento di PGI (grazie!) credo che il problema sia risolto. Provo e vi faccio sapere.