Istruzione On Error (Visual Basic)

Abilita una routine di gestione degli errori e specifica la posizione della routine all'interno di una routine; può essere usato anche per disabilitare una routine di gestione degli errori. L'istruzione On Error viene usata nella gestione degli errori non strutturati e può essere usata al posto della gestione strutturata delle eccezioni. La gestione delle eccezioni strutturata è incorporata in .NET, è in genere più efficiente ed è quindi consigliabile quando si gestiscono gli errori di runtime nell'applicazione.

Senza la gestione degli errori o la gestione delle eccezioni, qualsiasi errore di run-time che si verifica è irreversibile: viene visualizzato un messaggio di errore e l'esecuzione viene arrestata.

Nota

La parola chiave Error viene usata anche nell'istruzione di errore, supportata per la compatibilità con le versioni precedenti.

Sintassi

On Error { GoTo [ line | 0 | -1 ] | Resume Next }

Parti

Termine Definizione
GoToriga Abilita la routine di gestione degli errori che inizia dalla riga specificata nell'argomento riga necessario. L'argomento riga è qualsiasi etichetta di riga o numero di riga. Se si verifica un errore di run-time, i rami di controllo alla riga specificata rendono attivo il gestore degli errori. La riga specificata deve trovarsi nella stessa procedura dell'istruzione On Error o si verificherà un errore in fase di compilazione.
GoTo 0 Disabilita il gestore degli errori abilitati nella procedura corrente e lo reimposta su Nothing.
GoTo -1 Disabilita l'eccezione abilitata nella procedura corrente e la reimposta su Nothing.
Resume Next Specifica che quando si verifica un errore di run-time, il controllo passa all'istruzione immediatamente successiva all'istruzione in cui si è verificato l'errore e l'esecuzione continua da quel punto. Utilizzare questo modulo anziché On Error GoTo quando si accede agli oggetti.

Osservazioni:

Nota

È consigliabile usare la gestione strutturata delle eccezioni nel codice quando possibile, anziché usare la gestione delle eccezioni non strutturata e l'istruzione On Error. Per altre informazioni, vedere Istruzione Try...Catch...Finally.

Un gestore degli errori "enabled" è uno attivato da un'istruzione On Error. Un gestore di errore "attivo" è un gestore abilitato che sta gestendo un errore.

Se si verifica un errore mentre un gestore errori è attivo (tra l'occorrenza dell'errore e un'istruzione Resume, Exit Sub, Exit Function o Exit Property), il gestore errori della routine corrente non può gestire l'errore. Il controllo torna alla routine chiamante.

Se la routine chiamante ha un gestore errori abilitato, viene attivato per gestire l'errore. Se il gestore degli errori della routine chiamante è attivo, il controllo passa nuovamente attraverso le routine chiamante precedenti fino a quando non viene trovato un gestore errori abilitato, ma inattivo. Se non viene trovato alcun gestore di errore di questo tipo, l'errore è fatale nel punto in cui si è effettivamente verificato.

Ogni volta che il gestore errori passa il controllo a una routine chiamante, tale routine diventa la routine corrente. Quando un errore viene gestito da un gestore errori in qualsiasi routine, l'esecuzione riprende nella routine corrente nel punto designato dall'istruzione Resume.

Nota

Una routine di gestione degli errori non è una routine Sub o una routine Function. Si tratta di una sezione di codice contrassegnata da un'etichetta di riga o da un numero di riga.

Proprietà Number

Le routine di gestione degli errori si basano sul valore nella proprietà Number dell'oggetto Err per determinare la causa dell'errore. La routine deve testare o salvare i valori delle proprietà pertinenti nell'oggetto Err prima che si verifichi un altro errore o prima che venga chiamata una routine che potrebbe causare un errore. I valori delle proprietà nell'oggetto Err riflettono solo l'errore più recente. Il messaggio di errore associato a Err.Number è contenuto in Err.Description.

Istruzione Throw

Un errore generato con il metodo Err.Raise imposta la proprietà Exception su un'istanza appena creata della classe Exception. Per supportare la generazione di eccezioni di tipi di eccezione derivati, nel linguaggio è supportata un'istruzione Throw. Accetta un singolo parametro che rappresenta l'istanza dell'eccezione da generare. L'esempio seguente illustra come usare queste funzionalità con il supporto per la gestione delle eccezioni esistente:

    On Error GoTo Handler
    Throw New DivideByZeroException()
Handler:
    If (TypeOf Err.GetException() Is DivideByZeroException) Then
    ' Code for handling the error is entered here.
    End If

Si noti che l'istruzione On Error GoTo intercetta tutti gli errori, indipendentemente dalla classe di eccezione.

In caso di errore, riprende il successivo

On Error Resume Next fa sì che l'esecuzione continui con l'istruzione immediatamente successiva all'istruzione che ha causato l'errore di runtime o con l'istruzione immediatamente successiva alla chiamata più recente della routine contenente l'istruzione On Error Resume Next. Questa istruzione consente di continuare l'esecuzione nonostante un errore di runtime. È possibile posizionare la routine di gestione degli errori in cui si verifica l'errore anziché trasferire il controllo in un'altra posizione all'interno della routine. Un'istruzione On Error Resume Next diventa inattiva quando viene chiamata un'altra routine, pertanto è necessario eseguire un'istruzione On Error Resume Next in ogni routine chiamata se si vuole gestire gli errori inline all'interno di tale routine.

Nota

Il costrutto On Error Resume Next può essere preferibile a On Error GoTo durante la gestione degli errori generati durante l'accesso ad altri oggetti. Il controllo di Err dopo ogni interazione con un oggetto rimuove l'ambiguità relativa all'oggetto a cui è stato eseguito l'accesso dal codice. È possibile verificare quale oggetto ha inserito il codice di errore in Err.Number, nonché quale oggetto ha generato l'errore (l'oggetto specificato in Err.Source).

In caso di errore GoTo 0

On Error GoTo 0 disabilita la gestione degli errori nella procedura corrente. Non specifica la riga 0 come inizio del codice di gestione degli errori, anche se la routine contiene una riga numerata 0. Senza un'istruzione On Error GoTo 0, un gestore errori viene disabilitato automaticamente quando viene chiusa una routine.

In caso di errore GoTo -1

On Error GoTo -1 disabilita l'eccezione nella routine corrente. Non specifica la riga -1 come inizio del codice di gestione degli errori, anche se la routine contiene una riga numerata -1. Senza un'istruzione On Error GoTo -1, un'eccezione viene disabilitata automaticamente quando viene chiusa una routine.

Per impedire l'esecuzione del codice di gestione degli errori quando non si è verificato alcun errore, inserire un'istruzione Exit Sub, Exit Function o Exit Property immediatamente prima della routine di gestione degli errori, come nel frammento seguente:

Public Sub InitializeMatrix(ByVal Var1 As Object, ByVal Var2 As Object)
   On Error GoTo ErrorHandler
   ' Insert code that might generate an error here
   Exit Sub
ErrorHandler:
   ' Insert code to handle the error here
   Resume Next
End Sub

In questo caso, il codice di gestione degli errori segue l'istruzione Exit Sub e precede l'istruzione End Sub per separarla dal flusso della routine. È possibile inserire codice di gestione degli errori in qualsiasi punto di una routine.

Errori non intercettati

Gli errori non intercettati negli oggetti vengono restituiti all'applicazione di controllo quando l'oggetto è in esecuzione come file eseguibile. All'interno dell'ambiente di sviluppo, gli errori non intercettati vengono restituiti all'applicazione di controllo solo se sono impostate le opzioni appropriate. Vedere la documentazione dell'applicazione host per una descrizione delle opzioni da impostare durante il debug, di come impostarle e se l'host può creare classi.

Se si crea un oggetto che accede ad altri oggetti, è consigliabile provare a gestire eventuali errori non gestiti restituiti. Se non è possibile, eseguire il mapping dei codici di errore in Err.Number a uno dei propri errori e quindi passarli di nuovo al chiamante dell'oggetto. È necessario specificare l'errore aggiungendo il codice di errore alla costante VbObjectError. Ad esempio, se il codice di errore è 1052, assegnarlo come segue:

Err.Number = vbObjectError + 1052

Attenzione

Gli errori di sistema durante le chiamate alle librerie a collegamento dinamico di Windows (DLL) non generano eccezioni e non possono essere intercettati con l'intercettazione degli errori di Visual Basic. Quando si chiamano funzioni DLL, è necessario controllare ogni valore restituito per l'esito positivo o negativo (in base alle specifiche API) e, in caso di errore, controllare il valore nella proprietà LastDLLError dell'oggetto Err.

Esempio

In questo esempio viene innanzitutto utilizzata l'istruzione On Error GoTo per specificare il percorso di una routine di gestione degli errori all'interno di una routine. Nell'esempio, un tentativo di divisione per zero genera il numero di errore 6. L'errore viene gestito nella routine di gestione degli errori e il controllo viene quindi restituito all'istruzione che ha causato l'errore. L'istruzione On Error GoTo 0 disattiva l'intercettazione degli errori. L'istruzione On Error Resume Next viene quindi usata per rinviare l'intercettazione degli errori in modo che il contesto per l'errore generato dall'istruzione successiva possa essere noto per alcuni. Si noti che Err.Clear viene usato per cancellare le proprietà dell'oggetto Err dopo la gestione dell'errore.

Public Sub OnErrorDemo()
   On Error GoTo ErrorHandler   ' Enable error-handling routine.
   Dim x As Integer = 32
   Dim y As Integer = 0
   Dim z As Integer
   z = x / y   ' Creates a divide by zero error
   On Error GoTo 0   ' Turn off error trapping.
   On Error Resume Next   ' Defer error trapping.
   z = x / y   ' Creates a divide by zero error again
   If Err.Number = 6 Then
      ' Tell user what happened. Then clear the Err object.
      Dim Msg As String
      Msg = "There was an error attempting to divide by zero!"
      MsgBox(Msg, , "Divide by zero error")
      Err.Clear() ' Clear Err object fields.
   End If
Exit Sub      ' Exit to avoid handler.
ErrorHandler:  ' Error-handling routine.
   Select Case Err.Number   ' Evaluate error number.
      Case 6   ' Divide by zero error
         MsgBox("You attempted to divide by zero!")
         ' Insert code to handle this error
      Case Else
         ' Insert code to handle other situations here...
   End Select
   Resume Next  ' Resume execution at the statement immediately 
                ' following the statement where the error occurred.
End Sub

Requisiti

Spazio dei nomi:Microsoft.VisualBasic

Assembly: libreria di runtime di Visual Basic (in Microsoft.VisualBasic.dll)

Vedi anche