Richiesta chiarimento gestione eccezioni VB2010

di il
12 risposte

Richiesta chiarimento gestione eccezioni VB2010

Salve ragazzi,
ho praticamente terminato il mio progetto Windows Form ma ho lasciato per ultimo una cosa molto molto importante come l' inserimento dei blocchi "try catch" per la gestione delle eccezioni.
Ammetto di essere molto impreparato in materia quindi vorrei delle delucidazioni da voi, abbiate pazienza.

In particolare vorrei sapere, se ho una parte di codice nella quale vengono eseguite diverse operazioni il blocco deve prevedere il "try" iniziale e i "catch" con tutte le possibili eccezioni al termine, o un catch per ogni operazione che può generare un eccezione?

Entrando più nel dettaglio, nel mio progetto utilizzo un dataset sfruttando ovviamente i suoi metodi e, per esempio, il metodo "fill" può generare la seguente eccezione:

Ma in pratica, come andrebbe gestita? Con un semplice messaggio che invita a contattare l' assistenza?

Ringrazio subito chi vorrà aiutarmi.

12 Risposte

  • Re: Richiesta chiarimento gestione eccezioni VB2010

    Ciao Alsa,
    la gestione delle eccezioni è molto importante. Un programmatore deve gestire 2 cose:
    1. Come far variare il flusso dell'esecuzione del programma al presentarsi di determitate eccezioni in determinati punti dell'esecuzione.
    2. Come e in quali casi, al presentarsi dell'eccezione va informato l'utente.

    Parli di blocchi Try Catch, bene, e il Finally sicuro che non ti serva?
    Il Finally è un blocco di codice che viene eseguito comunque anche in caso si verifichi un errore.

    L'argomento che hai aperto è a mio avviso molto importante in quanto vedo un sacco di codice scritto con una gestione delle eccezioni basilare e poco intelligente.

    Per comprendere come usare al meglio la gestione delle eccezioni ti propongo se ti va di ragionare su un flusso logico per fare un pò di palestra.
    Prova a riscrivermi questo flusso logico con una gestione delle eccezioni:

    1. Apri una connessione a database 1 (A)
    2. Leggi un valore da una tabella del database 1 (A)
    3. Scrivi su file di log che hai letto il valore del database 1 (B)
    4. Scrivi un valore sulla tabella del database 1 (A)
    5. Apri una connessione a database 2 (B)
    6. Leggi un valore da una tabella del database 2 (B)
    7. Scrivi il valore letto al punto 6 su una tabella del database 1 (B)
    8. Chiudi la connessione al database 2 (B)
    9. Chiudi la connessione al database 1 (A)

    A = operazione che se fallisce pregiudica e deve interrompere l'esecuzione del programma informando l'utente
    B = operazione che se fallisce non deve pregiudicare l'esecuzione del programma

    Invito anche gli altri utenti interessati a partecipare
  • Re: Richiesta chiarimento gestione eccezioni VB2010

    Grazie mille Toki,
    Provo a svolgere l' "esercizio" ma ti chiedo subito scusa se qualcosa non sarà corretta:

    try
    1. Apri una connessione a database 1 (A)
    2. Leggi un valore da una tabella del database 1 (A)
    3. Scrivi su file di log che hai letto il valore del database 1 (B)
    4. Scrivi un valore sulla tabella del database 1 (A)
    5. Apri una connessione a database 2 (B)
    6. Leggi un valore da una tabella del database 2 (B)
    7. Scrivi il valore letto al punto 6 su una tabella del database 1 (B)
    8. Chiudi la connessione al database 2 (B)
    9. Chiudi la connessione al database 1 (A)
    catch ex as exception (1)
    msgbox("Programma terminato con l' errore (exception), impossibile connettersi al database 1")
    'chiudi programma
    catch ex as exception (2)
    msgbox("Programma terminato con l' errore (exception), impossibile leggere dal database 1")
    'chiudi programma
    catch ex as exception (3)
    goto 4
    catch ex as exception (4)
    msgbox("Programma terminato con l' errore (exception), impossibile scrivere nel database 1")
    'chiudi programma
    catch ex as exception (5)
    goto 9
    catch ex as exception (6)
    goto 8
    catch ex as exception (7)
    goto 8
    catch ex as exception (8)
    goto 9
    catch ex as exception (9)
    msgbox("Programma terminato con l' errore (exception), impossibile disconnettere il database 1")
    'chiudi programma
    end try

    preferisco andare per gradi e sapere se è corretta la mia logica ma poi dovrò farti altre domande.
  • Re: Richiesta chiarimento gestione eccezioni VB2010

    Ciao mi fa piacere che hai colto con favore l'approccio che ti ho proposto.

    Devi rivedere la soluzione, non puoi gestire le eccezioni cosi

    Per quanto riguarda i catch in genere si usa:
    Catch sqlEx As SqlException 'per le eccezioni SQL
    Catch ex As Exception 'per le eccezioni generiche
    Inoltre sei sicuro che va messo tutto il codice in un unico blocco Try Catch?
    Se ti va in errore la scrittura su file di log (punto 3) termini l'esecuzione del blocco e vai nella sezione catch. Il punto in questione è però di tipo B ricordi?
  • Re: Richiesta chiarimento gestione eccezioni VB2010

    Ero certo di commettere degli enormi strafalcioni, scusami e grazie ancora per l' aiuto che mi stai dando.
    L' approccio che mi hai proposto lo accetto di buon grado perchè è proprio quello che cercavo, infatti sono contrario agli esempi forniti senza un minimo di spiegazione logica, risolvono il problema al momento ma non chiariscono i dubbi e non insegnano nulla.

    Tornando all' esempio comunque, per quanto riguarda il punto 3 ho preferito gestire l' eccezione di modo che, ove si presentasse, appunto, l' eccezione, l' esecuzione del programma continuerebbe con il punto 4 ("goto 4") essendo il 3 un punto di tipo B. In questo caso specifico quindi, dov'è il mio errore?

    L' altra soluzione che avevo immaginato era di creare un blocco "Try... Catch... Finally" per ogni punto, ma mi sembrava un pò troppo incasinata come soluzione.
  • Re: Richiesta chiarimento gestione eccezioni VB2010

    Azz non mi ero accorto dell'approccio Spaghetti Code che usi col Goto

    Ho visto che scrivi:
    catch ex as exception (3)
    catch ex as exception (4)

    Non puoi abbinare il catch alle etichette.
    Puoi usare catch ex as exception ma non catch ex as exception (3), dove 3 è l'etichetta per il jump.

    Fai una prova.
  • Re: Richiesta chiarimento gestione eccezioni VB2010

    No, non volevo che questa riga:

    catch ex as exception (3)

    venisse letta come un istruzione ma, visto che parlavamo di logica e non di codice, il "(3)" sta ad indicare che quel Catch intercetta l' eccezione dell' istruzione numero 3, tutto qui.

    A questo punto perdonami, sono un pochino confuso, l' approccio di inserire tutte le istruzioni in un unico blocco try è corretto?
  • Re: Richiesta chiarimento gestione eccezioni VB2010

    Toki davvero, mi scuso se questa discussione offende la tua preparazione

    Ma per me è importante capire, allora ragionandoci un pò ho elaborato quest' altra soluzione, che ti espongo sempre a livello di logica e non di codice, dovrebbe anche evitare l' orrendo approccio spaghetti Code della prima soluzione:


    try
    1. Apri una connessione a database 1 (A)
    2. Leggi un valore da una tabella del database 1 (A)

    try
    3. Scrivi su file di log che hai letto il valore del database 1 (B)
    finally

    4. Scrivi un valore sulla tabella del database 1 (A)

    try
    5. Apri una connessione a database 2 (B)
    6. Leggi un valore da una tabella del database 2 (B)
    7. Scrivi il valore letto al punto 6 su una tabella del database 1 (B)
    8. Chiudi la connessione al database 2 (B)
    finally

    9. Chiudi la connessione al database 1 (A)

    catch ex as exception (1)
    msgbox("Programma terminato con l' errore (exception), impossibile connettersi al database 1")
    'chiudi programma
    catch ex as exception (2)
    msgbox("Programma terminato con l' errore (exception), impossibile leggere dal database 1")
    'chiudi programma
    catch ex as exception (4)
    msgbox("Programma terminato con l' errore (exception), impossibile scrivere nel database 1")
    'chiudi programma
    catch ex as exception (9)
    msgbox("Programma terminato con l' errore (exception), impossibile disconnettere il database 1")
    'chiudi programma
    end try


    Va meglio? comincio a capirci qualcosa?
  • Re: Richiesta chiarimento gestione eccezioni VB2010

    Ciao offendere la preparazione di chi? la mia non si offende mai e non sta su un piedistallo altrimenti sarei perduto!

    La gestione può essere fatta in diversi modi, ti propongo quello più semplice che mi è venuto in mente.
    Try
    	'1. Apri una connessione a database 1 (A)
    	' 2. Leggi un valore da una tabella del database 1 (A)
    	Try
    		'3. Scrivi su file di log che hai letto il valore del database 1 (B)
    	Catch ex As Exception
    
    	End Try
    	'4. Scrivi un valore sulla tabella del database 1 (A)
    	Try
    		' 5. Apri una connessione a database 2 (B)
    		'6. Leggi un valore da una tabella del database 2 (B)
    		'7. Scrivi il valore letto al punto 6 su una tabella del database 1 (B)
    	Catch ex As Exception
    
    	Finally
    		'8. Chiudi la connessione al database 2 (B)
    	End Try
    Catch ex As Exception
    	'Informi l'utente dell'errore bloccante
    Finally
    	'9. Chiudi la connessione al database 1 (A)
    End Try
    Puoi complicarlo in base alle tue esigenze.
  • Re: Richiesta chiarimento gestione eccezioni VB2010

    Ok Toki,
    fin qui mi hai chiarito un bel pò le idee però ti chiedo di entrare un pò nel mio caso specifico.
    In pratica, nel mio progetto ho una parte del codice che esegue 2 storedprocedure consecutivamente, la prima utilizza un datareader quindi prevede un istruzione "excecutereader" mentre la seconda prevede un istruzione "excecutenonquery".
    Dato che entrambe le istruzioni prevedono la stessa eccezione (sqlexception), nel caso si verificasse, come faccio a capire quale delle 2 ha generato l' eccezione? Devo obbligatoriamente prevedere 2 blocchi "try" distinti?
  • Re: Richiesta chiarimento gestione eccezioni VB2010

    Ciao Alsa,
    se la prima stored procedure serve a fornire i dati per l'esecuzione della seconda potresti accorparle in una sola stored procedure.
    Se cos'i non è la gestione con due blocchi Try Catch a cui hai pensato ti permette di gestire granularmente le eccezioni sulle due query.
  • Re: Richiesta chiarimento gestione eccezioni VB2010

    Grazie mille Toki,
    in effetti accorpando le 2 StoredProcedure in una si hanno solo vantaggi.

    Che dire, per il momento ti ringrazio per la disponibilità ma mi riservo di tenere viva questa discussione dato che il progetto è abbastanza complesso e sicuramente incapperò in situazioni che non abbiamo trattato con gli esempi fatti, abbi pazienza

    Grazie ancora!
  • Re: Richiesta chiarimento gestione eccezioni VB2010

    Ciao, mi trovi sempre da queste parti
Devi accedere o registrarti per scrivere nel forum
12 risposte