Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Tra audio e AI: la ricetta di Qualcomm per l'agentic AI
Tra audio e AI: la ricetta di Qualcomm per l'agentic AI
Snapdragon Soung Gen 2 è la piattaforma Qualcomm per i dispositivi audio sempre più integrati nel mondo dell'intelligenza artificiale: al prorpio interno tanta potenza elaborativa per gestire al meglio le necessità d'uso dell'agentic AI
Qualcomm annuncia la nuova generazione di SoC Snapdragon 8 Elite Gen 6
Qualcomm annuncia la nuova generazione di SoC Snapdragon 8 Elite Gen 6
In occasione del proprio Snapdragon Summit Qualcomm annuncia i due nuovi chip per dispositivi mobile di fascia alta che entreranno nel mercato nel corso del 2027: tanta potenza a disposizione per elaborazioni di intelligenza artificiale sempre più complesse
realme 16 Pro Harry Potter Edition: il nuovo midrange ha uno stemma di Hogwarts che cambia colore al sole!
realme 16 Pro Harry Potter Edition: il nuovo midrange ha uno stemma di Hogwarts che cambia colore al sole!
Hogwarts arriva in fascia media grazie a realme, con una special edition che unisce la Quadra Light-Sensing Color-changing Tech, un baule in stile Hogwarts Express pieno di collezionabili e una scheda tecnica sostanzialmente identica al 16 Pro di partenza: ecco cosa cambia davvero, come si comporta nell'uso quotidiano e quanto vale in base al prezzo di 699,99 euro
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 21-11-2014, 11: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, 15: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, 18: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, 10: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, 08: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, 12: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 12:56.
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 24-11-2014, 13: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, 16: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, 20: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, 08: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


Tra audio e AI: la ricetta di Qualcomm per l'agentic AI Tra audio e AI: la ricetta di Qualcomm per l'age...
Qualcomm annuncia la nuova generazione di SoC Snapdragon 8 Elite Gen 6 Qualcomm annuncia la nuova generazione di SoC Sn...
realme 16 Pro Harry Potter Edition: il nuovo midrange ha uno stemma di Hogwarts che cambia colore al sole! realme 16 Pro Harry Potter Edition: il nuovo mid...
Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce Recensione REDMI Note 17 Pro: il midrange con ba...
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema Insta360 Luna Ultra: la potenza del sensore da 1...
C'è un motivo se OpenAI non chiede un eu...
11 novità rilevanti nella nostra ...
Il tempo non è mai stato misurato...
Le auto elettriche sono più longe...
Stardock Snipboard: il dock che vuole ma...
Logitech G PRO X SUPERLIGHT 2 e SE, mous...
Supporto Linux in arrivo anche per i not...
Ninja MAX, la friggitrice ad aria da 6,2...
Poche scorte rimaste: Mini PC con Ryzen ...
Adobe Premiere è disponibile anche su An...
Sorpresa su Amazon: ora sono 2 le e-bike...
Galaxy S27, svelate le configurazioni di...
Gli studenti americani voltano le spalle...
Mercedes-Benz e Wayve si uniscono: guida...
Meta Muse Charm: sembra un Tamagotchi, m...
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:17.


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