Condividi tramite


Cenni preliminari sulla gestione delle eccezioni non strutturata

Aggiornamento: novembre 2007

Nella gestione delle eccezioni non strutturata si inserisce un'istruzione On Error all'inizio di un blocco di codice per gestire eventuali errori all'interno del blocco. Quando viene generata un'eccezione in una routine dopo l'esecuzione dell'istruzione On Error, il programma dirama verso l'argomento della riga specificato nell'istruzione On Error. L'argomento della riga, ovvero un numero o etichetta di riga, indica la posizione del gestore delle eccezioni.

A volte viene effettuata una chiamata dalla routine originale a un'altra e si verifica un'eccezione nella routine chiamata. In questi casi, se la routine chiamata non gestisce l'eccezione, questa viene ridistribuita alla routine chiamante e l'esecuzione dirama verso l'argomento della riga.

Nota:

È possibile che la gestione delle eccezioni non strutturata tramite On Error comporti la riduzione delle prestazioni dell'applicazione e provochi problemi nelle operazioni di debug e di gestione del codice. La gestione delle eccezioni strutturata è il metodo consigliato. Per ulteriori informazioni, vedere Cenni preliminari sulla gestione strutturata delle eccezioni per Visual Basic.

On Error GoTo Line

L'istruzione On Error GoTo Line presuppone che il codice di gestione degli errori inizi in corrispondenza della riga specificata nell'argomento obbligatorio line. Se si verifica un errore di runtime, il controllo dirama verso l'etichetta o il numero di riga specificato nell'argomento con conseguente attivazione del gestore errori*.* È necessario che la riga specificata si trovi nella stessa routine dell'istruzione On Error GoTo Line; in caso contrario, in Visual Basic viene generato un errore di compilazione. Nell'esempio seguente viene illustrato l'utilizzo di un gestore degli errori con un'etichetta di riga:

Sub TestSub
   On Error GoTo ErrorHandler
      ' Code that may or may not contain errors.
   Exit Sub

   ErrorHandler:
      ' Code that handles errors.
      Resume
End Sub

L'esempio contiene un gestore degli errori denominato ErrorHandler. Se il codice nella subroutine TestSub genera un errore, in Visual Basic viene eseguito immediatamente il codice che segue l'etichetta ErrorHandler. Al termine del blocco di gestione degli errori, l'istruzione Resume restituisce il controllo alla riga di codice dove l'errore si è verificato la prima volta. Il resto della subroutine continua quindi l'esecuzione come se l'errore non si fosse verificato.

Nota:

Inserire un'istruzione Exit Sub immediatamente prima del blocco di gestione degli errori. In caso contrario, il codice di gestione degli errori sarà eseguito al raggiungimento della fine della subroutine, provocando risultati indesiderati o imprevisti.

On Error Resume Next

L'istruzione On Error Resume Next consente di specificare che, in caso di errore di runtime, il controllo passa all'istruzione immediatamente successiva a quella in cui si è verificato l'errore. A questo punto, l'esecuzione continua. On Error Resume Next consente di inserire routine di gestione degli errori nel punto in cui si verificheranno anziché trasferire il controllo in un'altra posizione all'interno della routine.

Nota:

Se la routine chiama un'altra routine, l'istruzione On Error Resume Next diventa inattiva durante l'esecuzione della routine chiamata. È quindi necessario inserire un'istruzione On Error Resume Next in ciascuna delle routine chiamate per cui è necessaria. Questo è necessario perché il comportamento di Resume Next si applica solamente alla routine contenente l'istruzione On Error Resume Next. Se in una routine chiamata si verifica un errore non gestito, l'eccezione viene ridistribuita fino alla routine di chiamata e l'esecuzione riprende dall'istruzione successiva alla chiamata. In questi casi, l'errore non è gestito.

Resume può anche essere utilizzata indipendentemente, all'esterno dell'istruzione On Error. Se si utilizza Resume in questo modo, il controllo viene restituito all'istruzione che ha provocato l'errore. Resume viene normalmente utilizzata dopo che un gestore degli errori ha corretto l'errore.

In Visual Basic è disponibile anche l'istruzione ResumeNext, che indirizza il controllo alla riga immediatamente successiva alla riga di codice che ha provocato l'errore. È possibile utilizzare Resume Next per i casi in cui un errore non determina l'arresto dell'applicazione. È inoltre possibile utilizzarla se un errore non modifica i risultati previsti della subroutine.

Un'altra variante dell'istruzione Resume è Resume Line, simile a On Error GoTo Line. Resume Line passa il controllo alla riga specificata nell'argomento line. È possibile utilizzare Resume Line solo all'interno di un gestore errori.

Nota:

Quando si esegue il debug del codice, è necessario disattivare l'istruzione On Error Resume Next.

On Error GoTo 0

L'istruzione On Error GoTo 0 disattiva eventuali gestori degli errori nella routine corrente. Se non si include un'istruzione On Error GoTo 0, al termine della routine contenente il gestore delle eccezioni il gestore errori rimane disattivato.

Nota:

L'istruzione On Error GoTo 0 non specifica la riga 0 come inizio del codice di gestione degli errori, anche se la routine contiene una riga che ha per numero 0.

On Error GoTo -1

L'istruzione On Error GoTo -1 disattiva eventuali gestori delle eccezioni nella routine corrente. Se non si include un'istruzione On Error GoTo -1, al termine della routine l'eccezione viene disattivata automaticamente.

Nota:

L'istruzione On Error GoTo -1 non specifica la riga -1 come inizio del codice di gestione degli errori, anche se la routine contiene una riga che ha per numero -1.

Esempio di gestione delle eccezioni non strutturata

Nel codice che segue, il gestore delle eccezioni è denominato DivideByZero e gestisce un errore specifico, ovvero il tentativo di dividere per zero. Se si verifica un errore diverso, in Visual Basic viene generato un errore di runtime e viene terminata l'applicazione.

Sub ErrorTest ()
' Declare variables.
   Dim x As Integer, y As Integer, z As Integer
   ' The exception handler is named "DivideByZero".
   On Error GoTo DivideByZero
   ' The main part of the code, which might cause an error.
   x = 2
   y = 0
   z = x \ y

   ' This line disables the exception handler.
   On Error GoTo 0
      Console.WriteLine(x & "/" & y & " = " & z)

   ' Exit the subroutine before the error-handling code.
   ' Failure to do so can create unexpected results.
   Exit Sub

   ' This is the exception handler, which deals with the error.
   DivideByZero:
   ' Include a friendly message to let the user know what is happening.
   Console.WriteLine("You have attempted to divide by zero!")

   ' Provide a solution to the error.
   y = 2

   ' The Resume statement returns to the point at which
   ' the error first occurred, so the application
   ' can continue to run.
   Resume

End Sub

Vedere anche

Attività

Procedura: recuperare informazioni da un oggetto Error

Concetti

Oggetto Err nella gestione delle eccezioni non strutturata

Introduzione alla gestione delle eccezioni

Tipi di errori

Definizione delle circostanze di utilizzo della gestione delle eccezioni strutturata o non strutturata

Riferimenti

Istruzione End

Oggetto Err (Visual Basic)

Istruzione Exit (Visual Basic)

Istruzione On Error (Visual Basic)

Istruzione Resume