Gestione degli errori

Torna a Tutorials

VBA possiede lo stesso sistema di gestione degli errori proprio di Visual Basic. Il sistema di controllo degli errori permette ad una routine in errore, di gestire le operazioni ed i messaggi da intraprendere in caso di anomalia evitando di dare una segnalazione generica, cosa poco elegante e per nulla professionale.
Esistono sostanzialmente 2 metodi di gestione dell'errore.

On Error GoTo errore

In questo caso, quando viene generato un errore di run-time il controllo viene trasferito a 'ERRORE', attivando la routine di gestione degli errori. L'argomento (nel nostro caso 'ERRORE') può essere una etichetta di riga o un numero di riga. La riga specificata deve trovarsi nella stessa routine in cui si trova l'istruzione On Error; in caso contrario verrà generato un errore di compilazione.
Sintassi:
	On Error GoTo ERRORE

	' RIGA CHE GENERA UN ERRORE

	ERRORE:
	    ' GESTIONE DELL'ERRORE
	
La routine seguente genera un errore di divisione di un numero per zero e ne gestisce l'errore.
	Private Sub Prova()
	    On Error GoTo ERRORE
	    VarProva = 1 / 0
	    MsgBox "Questo messaggio non viene stampato", vbInformation
	ERRORE:
	    MsgBox "Impossibile dividere un numero per zero", _
	    vbCritical, "Errore"
	End Sub
	
Per evitare che il codice di gestione degli errori venga eseguito anche se non è stato generato alcun errore, è utile inserire un'istruzione Exit Sub, Exit Function o Exit Property , a seconda del tipo di routine, immediatamente prima della routine di gestione degli errori, come illustrato nell'esempio seguente:
	Sub Prova()
	    On Error GoTo ERRORE
	    varprova = 1 / 0
	    Exit Sub
	ERRORE:
	    MsgBox "Impossibile dividere un numero per zero", _ 
	    vbCritical, "Errore"
	    Resume Next
	End Sub
	
Per determinare la causa di un errore, le routine di gestione degli errori si basano sul valore della proprietà Number dell'oggetto Err. Una routine di gestione degli errori dovrebbe verificare o salvare i valori rilevanti delle proprietà dell'oggetto Err prima che venga generato un altro errore o prima che venga richiamata una routine che potrebbe generare un errore. I valori delle proprietà dell'oggetto Err si riferiscono esclusivamente all'ultimo errore. Il messaggio di errore associato a Err.Number è contenuto in Err.Description. Di seguito sono riportate le proprietà dell'oggetto Err:
Proprietà
Valore
Number Valore specificato come argomento per l'istruzione Error. Indica il codice dell'errore
Source Nome del progetto corrente di Visual Basic.
HelpFile Unità, percorso completo e nome del file della Guida in linea di Visual Basic.
HelpContext ID di contesto del file della Guida di Visual Basic relativo all'errore corrispondente al valore della proprietà Number.
Ecco un esempio di utilizzo delle proprietà dell'oggetto Err.
	    Sub prova()
	        On Error GoTo ERRORE
	         varprova = 1 / 0
	        Exit Sub
	ERRORE:
	        Msg = "Errore " & Str(Err.Number) & " generato da " _
	                & Err.Source & Chr(13) & Err.Description
	        MsgBox Msg, vbCritical, "Errore"
	        MsgBox Err.HelpFile, vbCritical, "Percorso file guida"
	        MsgBox Err.HelpContext, vbCritical, "ID errore file guida"
	    End Sub
	

On Error Resume Next

Determina la continuazione dell'esecuzione con l'istruzione immediatamente successiva a quella che ha generato l'errore di run-time oppure con l'istruzione immediatamente successiva all'ultima chiamata della routine contenente l'istruzione On Error Resume Next. Ciò consente di continuare l'esecuzione nonostante l'errore di run-time. Sarà quindi possibile creare la routine di gestione degli errori all'interno della routine, anziché trasferire il controllo in un altro punto della routine. Un'istruzione On Error Resume Next diventa inattiva quando viene richiamata un'altra routine, pertanto è necessario eseguire un'istruzione On Error Resume Next in ciascuna routine chiamata se si desidera che la gestione degli errori venga eseguita in ogni routine.
Sintassi:
	On Error Resume Next

	' RIGA CHE GENERA UN ERRORE

	If Err.Number <> 0 Then
	    ' GESTIONE DELL'ERRORE
	End If
	
Esempio:
	Private Sub Prova()
	    On Error Resume Next
	    VarProva = 1 / 0
	    MsgBox "Prima della gestione dell'errore", vbInformation
	    If Err.Number <> 0 Then
	        MsgBox "Impossibile dividere un numero per zero", _ 
	        vbCritical, "Errore"
	    End If
	    MsgBox "Dopo la gestione dell'errore", vbInformation
	End Sub
	

Cognolato Studio © 2005