Casino online











Mercato forex






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:
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 
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:
'...
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:
'...
Sub Main
    Dim g(8) As String
    Try
        For i As Byte = 0 To 9
            g(i) = "Ciao"
        Next
    Catch IOoRE As IndexOutOfRangeException
        Console.WriteLine("Errore in: " & IOoRE.TargetSite.ToString)
        Console.WriteLine(IOoRE.Message)
    End Try
End Sub 
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).
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:
Throw New [eccezione] 
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:
Try
  '...
Catch Ex As 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 IncorrectPasswordException
        Inherits 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 Value As String)
                MyBase.HelpLink = value
            End Set
        End Property
    End Class

    Sub Main()
        Dim Pass As String = "b7dha90"
        Dim NewPass As String

        Try
            Console.WriteLine("Inserire la password:")
            NewPass = Console.ReadLine
            If NewPass <> Pass Then
                Throw New IncorrectPasswordException
            End If
        Catch IPE As 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.