|
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
|