Torna indietro   Hardware Upgrade Forum > Software > Programmazione

OVHcloud Summit 2025: le novità del cloud europeo tra sovranità, IA e quantum
OVHcloud Summit 2025: le novità del cloud europeo tra sovranità, IA e quantum
Abbiamo partecipato all'OVHcloud Summit 2025, conferenza annuale in cui l'azienda francese presenta le sue ultime novità. Abbiamo parlato di cloud pubblico e privato, d'intelligenza artificiale, di computer quantistici e di sovranità. Che forse, però, dovremmo chiamare solo "sicurezza"
Un mostro da MSI: QD-OLED WQHD a 500 Hz con AI Care e DisplayPort 2.1a
Un mostro da MSI: QD-OLED WQHD a 500 Hz con AI Care e DisplayPort 2.1a
Abbiamo potuto mettere le mani in anteprima sul nuovo monitor MSI dedicato ai giocatori: un mostro che adotta un pannello QD-OLED da 26,5 pollici con risoluzione 2560 x 1440 pixel, frequenza di aggiornamento fino a 500 Hz e tempo di risposta di 0,03 ms GtG
DJI Neo 2 in prova: il drone da 160 grammi guadagna il gimbal e molto altro
DJI Neo 2 in prova: il drone da 160 grammi guadagna il gimbal e molto altro
DJI aggiorna la sua linea di droni ultraleggeri con Neo 2, un quadricottero da 160 grammi che mantiene la compattezza del predecessore ma introduce una stabilizzazione meccanica a due assi, sensori omnidirezionali e un sistema LiDAR
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 21-11-2014, 12:34   #1
tagan
Member
 
Iscritto dal: Apr 2008
Messaggi: 60
[JAVA] gestione degli errori

Ciao a tutti.
Mi trovo ora nell'imparare una delle cose, per quanto mi riguarda, più difficili.
Come gestire gli errori: non riesco a capire come propagarli.

vorrei fare una cosa tipo quella che uso in VB6:
Codice:
function getRecordSet(ByVal strSQL as String, ByRef rs as Recordset) as Boolean
On Error goto Gest_Err_Label
....
....
la funzione restituisce TRUE o FALSE a seconda se il RS viene creato o meno, in rs ho il recordSet creato in quanto viene passato per riferimento e il codice
Codice:
Dim rsMyRS as new ADODB.Recordset
if getRecordSet("query sql", rsMyRS) then
    codice per gestire il RS.
else
    err.raise richiama l'errore generato dalla funzione cosi non fa il codice successivo!
endif
gestisce tutto.

in java invece ho un po di difficoltà:
il codice
Codice:
LinkedList<String[]> cmb = db.rsToLL("select genere from TABELLA_INESISTENTE order by genere");
DefaultListModel lm = new DefaultListModel();
for (String[] combo : cmb) {
      lm.addElement(combo[0]);
}
genera l'errore nella classe dove c'è il metodo rsToLL "net.ucanaccess.jdbc.UcanaccessSQLException: user lacks privilege or object not found: TABELLA_INESISTENTE", ma poi continua a fare anche il DefaultListModel, generando altri errori di "Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException" ecc.ecc.

Come faccio a terminare l'esecuzione, rimandandola, ....diciamo all'ultima parentesi graffa che chiude tutto il codice?

la classe del metodo rsToLL è scritta cosi:
Codice:
....
....
    public LinkedList rsToLL(String strSQL){
        LinkedList<String[]> rsOUT = new LinkedList<>();
        try {
            Statement s = conn.createStatement();
            ResultSet rs = s.executeQuery(strSQL);
            ResultSetMetaData rsmd= rs.getMetaData();
            while (rs.next()){
                String element[]=new String[rsmd.getColumnCount()];
                for (int i=1;i<=rsmd.getColumnCount();i++){
                    element[i-1]=rs.getString(i);
                }
                System.out.println();
                rsOUT.addLast(element);
            }
            rs.close();
            s.close();
            return rsOUT;
        } catch (SQLException ex) {
            ex.printStackTrace();
            //JOptionPane.showMessageDialog(null, ex, "", JOptionPane.ERROR_MESSAGE);
            return null;
        }
    }
....
....
spero di essermi spiegato.
ciao tagan
tagan è offline   Rispondi citando il messaggio o parte di esso
Old 21-11-2014, 16:19   #2
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
Devi prima di tutto fare una scelta, ovvero se gestire l'errore con un'eccezione o ritornando un valore simbolico. Da come hai impostato il metodo rsToLL (restituisci null in caso di errore) sembra che tu voglia percorrere la seconda strada:
Codice:
LinkedList<String[]> cmb = db.rsToLL("select genere from TABELLA_INESISTENTE order by genere");
if (cmb != null) {
  DefaultListModel lm = new DefaultListModel();
  for (String[] combo : cmb) {
    lm.addElement(combo[0]);
  }
}
Oppure avresti potuto propagare l'eccezione, questo è uno dei modi possibili:
Codice:
public LinkedList rsToLL(String strSQL) throws Exception {
  try {
    ...
  } catch (SQLException ex) {
    ...
    throw ex;
  }
}
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 22-11-2014, 19:47   #3
tagan
Member
 
Iscritto dal: Apr 2008
Messaggi: 60
Quote:
Originariamente inviato da Daniels118 Guarda i messaggi
Oppure avresti potuto propagare l'eccezione, questo è uno dei modi possibili:
Codice:
public LinkedList rsToLL(String strSQL) throws Exception {
  try {
    ...
  } catch (SQLException ex) {
    ...
    throw ex;
  }
}
perfetto. questo è quello che mi interessava. come propagare l'errore. modificherò la classe con operazioni al DB in questo modo.

Un ultima cosa: se volessi creare una classe per gestire ogni tipo di eccezione, sia quelle generate dal linguaggio, che quelle generate da me, dal mio codice, come posso capire il tipo di eccezione?
mi spiego meglio con un esempio:
Codice:
try{
    //codice che può generare eccezione, esempio SQL
}
catch(Exception ex){
    new GestioneErrori(ex);
}

if (condizione_errore_digitazione){
    new GestioneErrori(new Exception("errore o avvertimento generato da me"));
}
la classe è
Codice:
public class GestioneErrori extends Exception {
    public GestioneErrori(Exception ex){
        switch (ex.qualcosa){
            case [tipo "IOException"]:
                //fai qualcosa

               //mostra messaggio di errore
               JOptionPane.showMessageDialog(null, ex, null, JOptionPane.ERROR_MESSAGE);
                break;

            case [tipo "SQLException"]:
                //fai qualcos'altro
                break;

            default:
                //mostra messaggio di avvertimento
                JOptionPane.showMessageDialog(null, ex, null, JOptionPane.WARNING_MESSAGE);
        }
    }
}
si può fare una cosa del genere? si può capire il tipo di eccezione, passando al costruttore una eccezione generica?

grazie.
tagan è offline   Rispondi citando il messaggio o parte di esso
Old 23-11-2014, 11:04   #4
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
Certamente. Puoi fare così:
Codice:
try {
  //Codice che genera eccezioni
} catch (TipoEccezione1 e1) {
  ...
} catch (TipoEccezione2 e2) {
  ...
}
Fai attenzione però, che il catch TipoEccezione1 cattura non solo le eccezioni di quel tipo, ma anche tutte le eccezioni che ereditano da esso. Se ad esempio TipoEccezione2 estende TipoEccezione1, il catch TipoEccezione2 non verrà mai eseguito.

Ricordati inoltre di utilizzare le eccezioni solo per gestire quelle condizioni che sono effettivamente anomale, e non per gestire situazioni normali.
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 24-11-2014, 09:10   #5
tagan
Member
 
Iscritto dal: Apr 2008
Messaggi: 60
Quote:
Originariamente inviato da Daniels118 Guarda i messaggi
Certamente. Puoi fare così:
Codice:
try {
  //Codice che genera eccezioni
} catch (TipoEccezione1 e1) {
  ...
} catch (TipoEccezione2 e2) {
  ...
}
Questo sistema lo conosco. volevo evitare di disseminare il codice di molte catch e richiamare una sola classe che potesse gestirle tutte, ma una volta passata l'eccezione (Exception ex), non riesco più a capire di che tipo è.

a questo punto, mi conviene creare nella classe che gestisce gli errori, diversi metodi che vengono richiamati nei catch disseminati nel codice.

Quote:
Originariamente inviato da Daniels118 Guarda i messaggi
Ricordati inoltre di utilizzare le eccezioni solo per gestire quelle condizioni che sono effettivamente anomale, e non per gestire situazioni normali.
ok. per questi casi ho creato un'altra classe per le notifiche all'utente.

grazie. ciao
tagan
tagan è offline   Rispondi citando il messaggio o parte di esso
Old 24-11-2014, 13:50   #6
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
Puoi usare l'operatore instanceof per determinare se un oggetto è un'istanza di una determinata classe (o di una classe che eredita da essa), però la gestione con i catch è molto più elegante, non capisco perché vorresti evitarla.

Edit: rileggendo la tua affermazione, forse ciò che vorresti evitare è di avere molte classi per le eccezioni, ebbene puoi farne una sola con un attributo "tipo" che andrai a valorizzare in modo opportuno.

Ultima modifica di Daniels118 : 24-11-2014 alle 13:56.
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 24-11-2014, 14:44   #7
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Puoi anche fare:

Codice:
try
{
   ....
}
catch (TipoEccezione1 | TipoEccezione2 | ... | TipoEccezioneN)
{
}
Sul tipo delle eccezioni vale quello che ha detto Daniels118: non puoi mettere in un catch simile una eccezione se estende o viene estesa da un'altra gia' presente.

Infine: evita sempre di fare il catch(Exception)
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 24-11-2014, 17:08   #8
tagan
Member
 
Iscritto dal: Apr 2008
Messaggi: 60
Quote:
Originariamente inviato da Daniels118 Guarda i messaggi
Edit: rileggendo la tua affermazione, forse ciò che vorresti evitare è di avere molte classi per le eccezioni, ebbene puoi farne una sola con un attributo "tipo" che andrai a valorizzare in modo opportuno.
ho fatto proprio una cosa del genere, ma utilizzando il metodo getClass e getName per capire che tipo di eccezione sia. dopo un po di tentativi sono riuscito a fare questo:
Codice:
public class GestisciEccezioni {
    public GestisciEccezioni(Exception ex, Object obj){
        switch (ex.getClass().getSimpleName()){
            case "FileNotFoundException":
                obj.getClass().getSimpleName()   //ho il nome della JFrame o della classe che ha generato l'errore; volendo potrei passare anche il nome del metodo in errore.
                break;
            case "RuntimeException":
                   //faccio altre cose
            case "SQLException":
                   //faccio altre cose
            case "NullPointerException":
                   //faccio altre cose
            default:
                ......
        }
    }
}
il codice pericoloso invece viene gestito cosi i tutte le classi del programma.
Codice:
try{
    ......
}
catch (Exception ex){
    new GestisciEccezioni(ex,this)
}
in questo modo, trasformo in eccezioni anche situazioni anomale di procedure importanti.

un altra classe simile invece, è GestisciAvvertimenti, che sempre con lo stesso sistema, mostra a video, un avvertimento per l'utente quando ad esempio, inserisce un dato non corretto, ma in questo caso non uso le eccezioni.

Grazie, ciao.
tagan è offline   Rispondi citando il messaggio o parte di esso
Old 24-11-2014, 21:49   #9
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da tagan Guarda i messaggi
Codice:
public class GestisciEccezioni {
    public GestisciEccezioni(Exception ex, Object obj){
        switch (ex.getClass().getSimpleName()){
            case "FileNotFoundException":
                obj.getClass().getSimpleName()   //ho il nome della JFrame o della classe che ha generato l'errore; volendo potrei passare anche il nome del metodo in errore.
                break;
            case "RuntimeException":
                   //faccio altre cose
            case "SQLException":
                   //faccio altre cose
            case "NullPointerException":
                   //faccio altre cose
            default:
                ......
        }
    }
}
Le eccezioni possono essere generate da condizioni anomale nell'applicazione o nella VM.
Alcune condizioni anomale sono "fisiologiche": per esempio, tenti di aprire un file che ovviamente potrebbe non esistere. Ecco allora che la FileNotFoundException viene sollevata e giustamente deve essere gestita.

Altre condizioni sono dovute ad errori di programmazione, e gestirle potrebbe portarti a seri errori, magari da altre parti.
Un esempio e' proprio quello che hai scritto tu: NullPointerException, cosi' come molte altre sotto la RuntimeException.

Sei davvero sicuro che questa gestione ti porti a scrivere programmi SICURI e ROBUSTI? La NullPointerException, per esempio, nel 99% dei casi indica un errore di programmazione e non ha senso gestirlo, anzi, potrebbe diventare pericolosissimo.
Analogamente alla NullpointerException ce ne sono parecchie altre che estendono RuntimeException, e che gestirle ti porta a programmi instabili.
Le eccezioni figlie di RuntimeException vanno sempre valutate attentamente prima di decidere se farne il catch oppure no (che, ripetiamo, e' facoltativo): per esempio, non c'e' problema per la NumberFormatException, ma cosa fare in caso di ClassCastException? Non sarebbe davvero meglio segnalare l'errore e terminare, dando cosi' la possibilita' di correggere l'applicazione?
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 25-11-2014, 09:07   #10
tagan
Member
 
Iscritto dal: Apr 2008
Messaggi: 60
Quote:
Originariamente inviato da sottovento Guarda i messaggi
Sei davvero sicuro che questa gestione ti porti a scrivere programmi SICURI e ROBUSTI? La NullPointerException, per esempio, nel 99% dei casi indica un errore di programmazione e non ha senso gestirlo, anzi, potrebbe diventare pericolosissimo.
Analogamente alla NullpointerException ce ne sono parecchie altre che estendono RuntimeException, e che gestirle ti porta a programmi instabili.
Le eccezioni figlie di RuntimeException vanno sempre valutate attentamente prima di decidere se farne il catch oppure no (che, ripetiamo, e' facoltativo): per esempio, non c'e' problema per la NumberFormatException, ma cosa fare in caso di ClassCastException? Non sarebbe davvero meglio segnalare l'errore e terminare, dando cosi' la possibilita' di correggere l'applicazione?
sono perfettamente d'accordo, ma proprio in quei casi, magari nei loro case, potrei visualizzare un messaggio con l'uso di JOptionPane del tipo

"errore grave il programma verrà chiuso. contattare il fornitore e comunicare i seguenti dati...(metterò il nome della classe, il messaggio d'errore e il nome del metodo)" e un exit(n)

un programma che crasha da un momento all'altro segnalando l'errore classico di java senza comunicazione all'utente è davvero brutto.

pensa se programmi come access, photoshop facessero così.
infatti loro hanno un modulo con il pulsante "invia segnalazione errore" ....e poi crepano
tagan è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


OVHcloud Summit 2025: le novità del cloud europeo tra sovranità, IA e quantum OVHcloud Summit 2025: le novità del cloud...
Un mostro da MSI: QD-OLED WQHD a 500 Hz con AI Care e DisplayPort 2.1a Un mostro da MSI: QD-OLED WQHD a 500 Hz con AI C...
DJI Neo 2 in prova: il drone da 160 grammi guadagna il gimbal e molto altro DJI Neo 2 in prova: il drone da 160 grammi guada...
L'IA "seria" di Appian è diversa: inserita nei processi e rispetta dati e persone L'IA "seria" di Appian è divers...
Polestar 3 Performance, test drive: comodità e potenza possono convivere Polestar 3 Performance, test drive: comodit&agra...
Weekend e offerte Amazon Black Friday ag...
Il tuo indirizzo IP è compromesso...
Eureka J15 Evo Ultra in super sconto: or...
Robot aspirapolvere in super sconto per ...
Black Friday Amazon: le migliori occasio...
Il nuovo Esplora file per Windows 11 &eg...
Black Friday e Apple: qui tutte le offer...
Il CEO di Epic contro l'etichetta 'conte...
A causa di un problema durante il lancio...
Per il responsabile delle Porsche 911 e ...
Ritorno di fiamma tra Apple e Intel: gal...
Horses è stato 'bannato': l'horro...
Truffe finanziarie sui social, scatta il...
Tesla inaugura a Busto Arsizio la postaz...
Barriere autostradali fotovoltaiche: Ana...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 10:21.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v