A32. Gestione degli errori
A volte capita, purtroppo, che possano verificarsi errori durante l'esecuzione di un programma: a questo inconveniente si può ovviare in due
modi: correggere il codice in modo che non si verifichi nessun errore; inserire nel sorgente un pezzo di codice che gestisca l'errore. In
questa lezione vedremo la seconda opzione. Il costrutto che si usa per gestire gli errori si chiama Try ed ha questa sintassi:
Dim g(8) As String
Try
For i as byte = 0 To 9
g(i) = "Ciao"
Next
Catch IOoRE As IndexOutOfRangeException
Console.WriteLine("Si è tentato di accedere a un valore non nell'array!")
End Try
Questo codice genera volutamente un errore: si tenta di accedere al decimo elemento dell'array (contrasegnato dall'indice 9), ma esso non
esiste, quindi viene generato un errore di tipo IndexOutOfRangeException, che noi 'intercettiamò con Catch dicendo specificamente di eseguire
un determinato codice se si verifica quel determinato errore: in questo caso visualiziamo un messaggio di errore. Potrebbe sorgere un dubbio,
però: a cosa serve la variabile che noi dichiariamo come IndexOutOfRangeException? Beh, se si sta sviluppando un programma particolarmente
lungo o coplesso potrebbe essere utile sapere l'esatto messaggio dell'errore e magari anche il numero, come in questo esempio:
Quattro cose ancora: primo, prima di mettere un ciclo Try controllate benissimo se l'errore non si possa correggere da codice solo modificando qualcosa e solo come ultima risorse ricorrete al try; secondo, è possibile prendere un'eccezione come di tipo execption, che rappresenta tutte le eccezioni; terzo, è possibile lanciare un'eccezione anche all'interno di una procedura che scrivete voi, semplicemente usando la sintassi:
In [variabile] dobbiamo solo specificare un nome per una variabile che viene inizializzata quando si verifica l'errore [eccezione]. In questo caso, [eccezione] è un tipo uguale o derivato da System.Exception che descrive l'errore generato. Ad esempio:Try ' codice che potrebbe generare un errore Catch [variabile]As [eccezione]' codice da eseguire quando avviene l'errore Catch [variabile2]As [eccezione2]' eccetera ' ... End Try
'...
Questo codice riporta il messaggio esatto dell'errore, ossia "Index was outside of the bounds of the array", e specifica anche la procedura in cui si è verificato l'errore (ossia "Errore In Void Main()", che viene specificato con la sintassi del C). Da non dimenticare è che si possono usare anche più Catch in un Try. Infine, per sapere che tipo di errore si verifica, se se ne verifica uno, basta semplicemente guardare la finestra di descrizione e prelevarlne il titolo (in SharpDevelop c'è scritto nella descrizione).'... Sub MainDim g(8)As String Try For iAs Byte = 0To 9 g(i) = "Ciao"Next Catch IOoREAs IndexOutOfRangeException Console.WriteLine("Errore in: " & IOoRE.TargetSite.ToString) Console.WriteLine(IOoRE.Message)End Try End Sub
Quattro cose ancora: primo, prima di mettere un ciclo Try controllate benissimo se l'errore non si possa correggere da codice solo modificando qualcosa e solo come ultima risorse ricorrete al try; secondo, è possibile prendere un'eccezione come di tipo execption, che rappresenta tutte le eccezioni; terzo, è possibile lanciare un'eccezione anche all'interno di una procedura che scrivete voi, semplicemente usando la sintassi:
quarto: è possibile aggiungere una clausola a Try in modo che un determinato codice venga eseguito in ogni caso, sia che si verifichi l'errore sia che non si verifichi affatto:Throw New [eccezione]
Try ' ... Catch ExAs Exception' ... Finally ' codice da eseguire sempre anche dopo errori End Try
Eccezioni personalizzate
È possibile creare anche eccezioni personalizzate, scrivendo una nuova classe che gestisca l'errore. Per convenzione, il nome della classe deve
terminare con "Exception" e la classe deve ereditare la classe System.Exception. Se questa seconda condizione non fosse soddisfatta, non si potrebbe
lanciare l'eccezione personalizzata usando Throw. Un esempio:
Module Module1 'Questa classe rappresenta l'errore lanciato quando una 'password imessa è sbagliata Class IncorrectPasswordExceptionInherits System.Exception 'Queste proprietà ridefiniscono quelle della classe Exception 'perciò sono dichiarate overrides Public Overrides ReadOnly Property Message()As String Get Return "La password inserita è sbagliata!"End Get End Property Public Overrides Property HelpLink()As String Get Return "http://totem.altervista.org"End Get Set (ByVal ValueAs String )My Base.HelpLink = valueEnd Set End Property End Class Sub Main()Dim PassAs String = "b7dha90"Dim NewPassAs String Try Console.WriteLine("Inserire la password:") NewPass = Console.ReadLineIf NewPass <> PassThen ThrowNew IncorrectPasswordExceptionEnd If Catch IPEAs IncorrectPasswordException 'Visualizza il messaggio Console.WriteLine(IPE.Message) 'E il link d'aiuto Console.WriteLine("Help: " & IPE.HelpLink)End Try Console.ReadKey()End Sub End Module
The Totem's Lair - Copyright (C) 2009
È vietata la riproduzione sia totale che parziale del sito.



