• Regolamento Macrocategoria DEV
    Prima di aprire un topic nella Macrocategoria DEV, è bene leggerne il suo regolamento. Sei un'azienda o un hosting/provider? Qui sono anche contenute informazioni per collaborare con Sciax2 ed ottenere l'accredito nella nostra community!

Guida Try..Catch..Finally & gestione errori personalizzate!

TBH

Utente Master
Autore del topic
24 Dicembre 2012
2.134
115
Miglior risposta
0
Prima di parlare direttamente della try catch end try , intendo partire dalla gestione di un eccezione/errore in linguaggi COM e Win32, Come il Visual Basic 6.0 ,la gestione dell'errore si basava sulla clausola On error, tramite la quale , era possibile rimandare a un determinato blocco di codice. La clausola On error permetteva inoltre tramite un "Particolare" oggetto di nome Err che identificava gli errori restituendo valori , si trattava comunque di un identificazione numerica di un errore Esempio : HRESULT x 00128371

IL Net framework invece ha sostituito questo ingarbugliato modo di gestire l'eccezione usando un Blocco preciso è una Classe : system.Exception
da cui derivano tutti gli altri !
D'altro canto c'è da dire che le differenze sono abissali , nel net framework tuttora esiste l'oggetto Err e On error , ritenuto utile per gestire errori di tipo Unmaneged(quindi indipendenti dal Garbage Collector) oppure in caso si usassero oggetti COM (tra i più famosi cito winsock)

La Classe System Exception

è una classe che tutti conoscono , in quanto serve per gestire gli errori di un applicazione , il try catch è presente in tutti i linguaggi .net come il C#,J# , asp.net etc.. è presente anche in altri linguaggio che non sfruttano il net framework come il php e il C++ etc...
Quindi è un istruzione , fondamentale per qualsiasi applicazione , perchè non esiste applicazione che non lanci un eccezione, persino la moltiplicazione di due numeri può lanciare un eccezione di overflow!

Vediamo come è formato il Costrutto Try catch

Try

Codice "Sospetto"

Catch ex As Exception

//gestione errore

Finally

// Si tratta di codice di Cleanup , utilizzato per liberare risorse indipendentemente dalla creazione di eccezione o meno

End Try

Non gestire un errore comporta il blocco dell'applicazione. Vediamo come si comporta il "gestore" dell'errore nel momento in cui viene lanciata un "eccezione"

I membri Comuni Nella Classe Exception (quindi disponibili anche nelle classe derivate dal system.exception)

Nome Descrizione
Message Contiene la descrizione di un errore
Source Contiene il Nome dell'assembly che ha causato l'eccezione
StackTrace Lo stack chiamante che ha generato l'eccezione, Quindi possiamo capire il codice "Sospetto"
Data Contiene Info Dettagliate sull'errore
HelpLink Si tratta di una proprietà che permette di indirizzare l'utente su un Url
InnerException Un oggetto particolare che può contenere un eccezione più specifica
ToString Metodo derivato da system.object , ridefinito per restituire il messaggio (message) e lo stack chiamante (stackTrace)

Bene questi sono i membri presenti nel system.exception

Vediamo qualche esempio Semplice dopodichè passiamo all'ultima parte della guida , creare gestori di eccezioni personalizzate

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

errorwos.jpg


in un Try possono essere anche presenti più catch e end try

Vediamo un ultimo esempio includendo anche finally

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

il blocco Finally si può notare che chiude il flusso di scrittura di x!

2°PARTE --- ECCEZIONE PERSONALIZZATE

Creare L'eccezione Personalizzate , sfrutta due cose fondamentali del Vb.net : Ereditarietà e Polimorfismo!

Ci sono poche regole da sapere per creare una classe con eccezioni personalizzate :

1) La classe creata deve derivare da System.exception o da ApplicationException
2) La Classe deve terminare con il nomeException
3) I membri devono essere naturalmente Poliformici

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Come si nota , se il label1.text è diverso dalla textbox1.text

Throw new ' Lancia Un eccezzione

La intercetta naturalmente nel catch che avrà il nome della classe creata Errore01Exception
Nella classe errore01exception ho ereditato da system.exception Tramite Inherits

nel Caso di Data non modifico nulla anche se uso Overrides 'si può anche eliminare
Nel secondo caso Modifico il Valore di ritorno (Message)
Nel Terzo Caso uso Shadows che cambia Completamente la proprietà infatti la rendo solo readonly e modifico il Valore Restituito come nella precedente Proprietà

Spero Questa Guida Sia Utile!
 
Ultima modifica: