Share via


Cenni preliminari sulla gestione strutturata delle eccezioni per Visual Basic

Aggiornamento: Luglio 2008

In Visual Basic è supportata la gestione strutturata delle eccezioni che consente di creare e gestire programmi tramite gestori di errori efficaci e completi. La gestione delle eccezioni strutturata è progettata per rilevare e risolvere gli errori durante l'esecuzione, combinando una struttura di controllo (simile a Select Case o While) con eccezioni, blocchi di codice protetti e filtri.

L'istruzione Try...Catch...Finally consente di proteggere blocchi di codice che potrebbero generare degli errori. È possibile nidificare i gestori eccezioni; in questo caso, le variabili dichiarate in ogni blocco avranno ambito locale.

Istruzione Try...Catch...Finally

Nell'esempio di codice che segue viene illustrata la struttura di un'istruzione Try...Catch...Finally.

Try
    ' Starts a structured exception handler.
    ' Place executable statements that may generate 
    ' an exception in this block.
Catch '[optional filters]
    ' This code runs if the statements listed in 
    ' the Try block fail and the filter on the Catch statement is true.
'[Additional Catch blocks]
Finally
    ' This code always runs immediately before
    ' the Try statement exits.
End Try
' Ends a structured exception handler.

Il blocco Try di un gestore di eccezioni Try...Catch...Finally contiene la sezione di codice da monitorare per la ricerca delle eccezioni. Se durante l'esecuzione di questa sezione si verifica un errore, Visual Basic consente di esaminare ogni istruzione Catch all'interno di Try...Catch...Finally finché non ne viene trovata una che presenta una condizione corrispondente all'errore. Se viene trovata, il controllo viene trasferito alla prima riga di codice nel blocco Catch. Se non viene trovata alcuna istruzione Catch corrispondente, la ricerca passa alle istruzioni Catch del blocco Try...Catch...Finally esterno contenente il blocco in cui si è verificata l'eccezione. Questo processo viene eseguito su tutto lo stack, finché non viene trovato un blocco Catch corrispondente nella routine corrente. Se non viene rilevata alcuna corrispondenza, verrà generato un errore.

Il codice nella sezione Finally viene sempre eseguito per ultimo, appena prima che il blocco di gestione degli errori perda il proprio ambito, indipendentemente dall'esecuzione del codice nei blocchi Catch. Inserire il codice di pulitura, ad esempio quello che consente di chiudere i file e rilasciare gli oggetti, nella sezione Finally. Se è necessario eseguire una pulitura delle risorse ma non intercettare eccezioni, utilizzare l'istruzione Using anziché una sezione Finally. Per ulteriori informazioni, vedere Istruzione Using (Visual Basic).

Applicazione di filtri agli errori nel blocco Catch

I blocchi Catch includono tre opzioni che consentono di filtrare errori specifici. In una di queste opzioni gli errori vengono filtrati in base alla classe dell'eccezione, in questo caso, ClassLoadException, come illustrato nel codice che segue.

Try
    ' "Try" block.
Catch e as ClassLoadException
    ' "Catch" block.
Finally
    ' "Finally" block.
End Try

Se si verifica un errore ClassLoadException, il codice all'interno del blocco Catch specificato verrà eseguito.

Nella seconda opzione di filtraggio degli errori la sezione Catch può filtrare in base a qualsiasi espressione condizionale. Questo tipo di filtro Catch viene in genere utilizzato per verificare numeri di errore specifici, come illustrato nel codice che segue.

Try
   ' "Try" block.
Catch When ErrNum = 5 'Type mismatch.
   ' "Catch" block.
Finally
   ' "Finally" block.
End Try

Una volta rilevato il gestore di errori corrispondente, Visual Basic consente di eseguire il codice all'interno del gestore e, successivamente, di passare il controllo al blocco Finally.

Nota:

Mentre si tenta di trovare un blocco Catch per gestire un'eccezione, ogni gestore di blocco viene valutato finché non viene rilevata una corrispondenza. Poiché è possibile che tali gestori costituiscano chiamate a funzioni, potrebbero verificarsi effetti collaterali imprevisti. È possibile, ad esempio, che una chiamata del genere modifichi una variabile pubblica e che quest'ultima venga quindi utilizzata nel codice di un blocco Catch differente a cui viene assegnata la gestione dell'eccezione.

La terza alternativa consente di combinare le prime due opzioni e utilizzare entrambe per la gestione delle eccezioni. Le istruzioni Catch vengono considerate dalla più specifica alla meno specifica. Un blocco Catch intercetterà automaticamente tutte le eccezioni derivate da Exception e pertanto dovrebbe essere sempre l'ultimo blocco prima di Finally.

Diramazioni all'esterno dei blocchi Try…Catch

È possibile diramare da un blocco Catch nell'istruzione Try iniziale o nell'istruzione End Try, mentre non è possibile farlo in un blocco Try…Catch di inclusione. Tale procedura è illustrata di seguito:

Diramazioni Try Catch

Esempio di gestione delle eccezioni strutturata

Nell'esempio seguente viene mostrato un altro semplice gestore di errori in cui viene utilizzata l'istruzione Try...Catch...Finally:

Option Strict On
Imports System.IO

Module Module1
    Private Const FileName As String = "TestFile.data"

    Public Sub Main()

        ' First, create a new data file and write some data to the file.
        ' 1. Create the new, empty data file.
        If File.Exists(FileName) Then
            File.Delete(FileName)
        End If
        Dim fs As New FileStream(FileName, FileMode.CreateNew)

        ' 2. Create a BinaryWriter object for the data.
        Dim writer As New BinaryWriter(fs)

        ' 3. Write some sample data to the file.
        For i = 0 To 10
            writer.Write(i)
        Next i
        writer.Close()
        fs.Close()

        ' Now read from the file you just made.
        ' 1. Create a BinaryReader object for the data stream.
        fs = New FileStream(FileName, FileMode.Open, FileAccess.Read)
        Dim reader As New BinaryReader(fs)

        ' 2. Read data from TestFile.data. The loop terminates with an
        ' EndOfStreamException when an attempt is made to read past
        ' the end of the stream.
        Try
            ' This loop terminates with an EndOfStreamException when it 
            ' reaches the end of the stream.
            While True
                Console.WriteLine(reader.ReadInt32())
            End While
            Console.WriteLine("The data was read with no error.")
        ' 3. Report the first error that is caught, if there is one.
        Catch eosExcep As EndOfStreamException
            ' This Catch block is executed when the reader attempts
            ' to read past the end of the stream.
            Console.WriteLine("End-of-stream exception occurred.")
        Catch IOExcep As System.IO.IOException
            ' For this Catch block, some other error occurred before
            ' the end of stream was reached. Print the standard
            ' exception message.
            Console.WriteLine(IOExcep.Message)
        Finally
            ' The Finally block is always executed.
            Console.WriteLine("Executing the Finally block.")
            reader.Close()
            fs.Close()
        End Try
    End Sub

End Module

Il blocco Finally viene sempre eseguito, indipendentemente da eventuali azioni verificatesi in blocchi Catch precedenti. Non è possibile utilizzare Resume o Resume Next nella gestione delle eccezioni strutturata.

Nota:

Nell'esempio precedente qualsiasi eccezione diversa dalla classe IOException o EndOfStreamException viene propagata alla chiamante non gestita.

Vedere anche

Attività

Risoluzione dei problemi di gestione delle eccezioni

Concetti

Introduzione alla gestione delle eccezioni

Tipi di errori

Cenni preliminari sulla gestione delle eccezioni non strutturata

Riferimenti

Istruzione Try...Catch...Finally (Visual Basic)

BinaryReader

BinaryWriter

FileStream

Altre risorse

Attività di gestione delle eccezioni

Cronologia delle modifiche

Data

Cronologia

Motivo

Luglio 2008

Sostituito l'esempio della sezione "Esempio di gestione delle eccezioni strutturata".

Commenti e suggerimenti dei clienti.