Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Wi-Fi 7 con il design di una vetta innevata: ecco il nuovo sistema mesh di Huawei
Wi-Fi 7 con il design di una vetta innevata: ecco il nuovo sistema mesh di Huawei
HUAWEI WiFi Mesh X3 Pro Suite è probabilmente il router mesh più fotogenico che si possa acquistare oggi in Italia, ma dietro il guscio in acrilico trasparente e le luci LED dinamiche c'è una macchina tecnica costruita attorno allo standard Wi-Fi 7, con velocità teoriche Dual-Band fino a 3,6 Gbps e una copertura fino a 120 m² una volta abbinato il router principale all'extender incluso nel kit
Core Ultra 7 270K Plus e Core Ultra 7 250K Plus: Intel cerca il riscatto ma ci riesce in parte
Core Ultra 7 270K Plus e Core Ultra 7 250K Plus: Intel cerca il riscatto ma ci riesce in parte
Abbiamo provato le nuove CPU Intel Core Ultra 7 270K Plus e Core Ultra 7 250K Plus: più core e ottimizzazioni al funzionamento interno migliorano le prestazioni, anche in virtù di prezzi annunciati interessanti. A questo si aggiungono nuove ottimizzazioni software. Purtroppo, a fronte di prestazioni di calcolo elevate, il quadro rimane incerto nel gaming, dove l'andamento rimane altalenante. Infine, rimane il problema della piattaforma a fine vita.
PC Specialist Lafité 14 AI AMD: assemblato come vuoi tu
PC Specialist Lafité 14 AI AMD: assemblato come vuoi tu
Il modello "build to order" di PCSpecialist permette di selezionare una struttura base per un sistema, personalizzandolo in base alle specifiche esigenze con una notevole flessibilità di scelta tra i componenti. Il modello Lafité 14 AI AMD è un classico notebook clamshell compatto e potente, capace di assicurare una elevata autonomia di funzionamento anche lontano dalla presa di corrente
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


Wi-Fi 7 con il design di una vetta innevata: ecco il nuovo sistema mesh di Huawei Wi-Fi 7 con il design di una vetta innevata: ecc...
Core Ultra 7 270K Plus e Core Ultra 7 250K Plus: Intel cerca il riscatto ma ci riesce in parte Core Ultra 7 270K Plus e Core Ultra 7 250K Plus:...
PC Specialist Lafité 14 AI AMD: assemblato come vuoi tu PC Specialist Lafité 14 AI AMD: assemblat...
Recensione Nothing Phone 4(a): sempre iconico ma ora più concreto Recensione Nothing Phone 4(a): sempre iconico ma...
Corsair Vanguard Air 99 Wireless: non si era mai vista una tastiera gaming così professionale Corsair Vanguard Air 99 Wireless: non si era mai...
Epic Games licenzia 1000 persone, il mot...
Offerte OLED su Amazon: protagonisti gli...
Non solo smartphone: ecco come 'Human x ...
Offerte Amazon sui componenti PC: schede...
La Switch 2 ha venduto meno del previsto...
Crimson Desert si ferma: il lancio &egra...
LG è ancora leader indiscussa del...
Apple non si accontenta: arriva la pubbl...
Bonus domotica 2026: quanto vale, come o...
OnePlus 15T è ufficiale: un top d...
Un attacco informatico blocca gli etilom...
OpenAI chiude Sora: addio al generatore ...
La NASA dimostrerà l'utilizzo del...
L'ESA acquisterà una missione Cre...
La NASA cambia idea sulle stazioni spazi...
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: 09:35.


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