Gestione degli errorin in Visual Basic

Quando si esegue un programma, anche il più semplice, c’è sempre la possibilità che accada qualcosa che non è stato previsto durante la progettazione, cioè che si verifichi un errore, una situazione inaspettata che l’applicazione non è in grado di gestire.
Quando si presenta un problema del genere, il programma visualizza un messaggio e, subito dopo, termina la sua esecuzione. Un errore si verifica, ad esempio, se si cerca di effettuare una divisione per zero, se si tenta di caricare in una PictureBox un file immagine inesistente, ecc. 
Un programma ben sviluppato dovrebbe prevedere delle procedure in grado di risolvere gli errori più comuni; continuando gli esempi precedenti, se si effettua una divisione per zero dovrebbe apparire un messaggio che informa che l’operazione non è valida e, allo stesso modo, se ci cerca di aprire un file inesistente, l’utente dovrebbe essere avvisato e avere la possibilità di modificare la sua scelta.

figura

In VB, la gestione degli errori si effettua utilizzando i cosiddetti gestori di errori. Il loro utilizzo è molto semplice. Per installare un gestore degli errori, è sufficiente scrivere (di solito come prima istruzione all’interno di una routine):

On Error GoTo <Etichetta>

Dove <Etichetta> è una sorta di “segnalibro” in corrispondenza del quale inizia il codice incaricato di gestire gli errori. A questo punto se, all’interno della routine, si verifica un errore (chiamato errore di run-time), l’esecuzione passa immediatamente alla parte di codice che si trova in corrispondenza dell’etichetta definita con On Error… Provate, ad esempio, a scrivere queste istruzioni nell’evento Form_Load:

Dim A As Long, B As Long, C As Long
A = 5
B = 0
C = A / B ‘Questa istruzione causa un errore di divisione per zero.
MsgBox “Il risultato della divisione è: ” & C

figura

Ora premete F5: quando VB cercherà di eseguire l’istruzione C = A / B, mostrerà una finestra di errore come quella visibile a lato, contenente due tipi di informazioni, il numero dell’errore e una breve descrizione dello stesso. Premendo il tasto Fine l’esecuzione del programma verrà terminata; facendo clic su Debug VB evidenzierà l’istruzione che ha causato l’errore, consentendo la sua modifica; il pulsante ?, infine, visualizza la Guida in linea relativa all’errore che si è appena verificato. Il pulsante Continua, attivo solo in certe situazioni, permette di continuare l’esecuzione del programma ignorando l’errore.

figura

Cerchiamo di modificare il codice in modo da gestire l’errore. Come abbiamo detto, per prima cosa dobbiamo creare un gestore degli errori con l’istruzione On Error GoTo <Etichetta>, dopodiché dobbiamo scrivere il codice di gestione vero e proprio. Ecco come possiamo modificare l’esempio:

Private Sub Form_Load()
Crea il gestore degli errori.
On Error GoTo GestoreErrori
Dim A As Long, B As Long, C As Long
A = 5
B = 0
C = A / B Questa istruzione causa un errore di divisione per zero.
MsgBox ììIl risultato della divisione è: ìì & C
Exit Sub

GestoreErrori:
Queste istruzioni vengono eseguite quando si verifica un errore.
If Err.Number = 11 Then
Divisione per zero.
MsgBox “Si è verificato un errore di divisione per zero. Controllare i valori digitati e riprovare.”
End If
End Sub

Analizziamo quanto abbiamo scritto. L’istruzione On Error Goto GestoreErrori crea il gestore degli errori, cioè dice al programma che, in caso di errori, deve passare ad eseguire le istruzioni scritte sotto l’etichetta GestoreErrori. L’istruzione Exit Sub ha lo scopo di uscire dalla routine senza eseguire le istruzioni seguenti; notate che, se invece di una routine fossimo stati in una funzione, l’istruzione per uscire da essa sarebbe stata Exit Function. All’interno del gestore degli errori viene usato l’oggetto Err, che contiene informazioni relative agli errori di run-time; in particolare, in questo esempio controlliamo il valore di Err.Number, che restituisce il numero dell’ultimo errore verificatosi. Alcune volte si usa la proprietà Err.Description, la quale contiene la descrizione dell’errore. Ora provate a premere F5 per eseguire il codice; osserverete che non comparirà più la finestra di errore di VB, ma la MessageBox che abbiamo definito noi:

Un’altra istruzione importante è l’istruzione Resume, che riprende l’esecuzione dopo il completamento di una routine di gestione degli errori. Solitamente è usata in due modi: Resume, riprende l’esecuzione dalla stessa istruzione che ha causato l’errore; Resume Next, riprende l’esecuzione dall’istruzione successiva a quella che ha provocato l’errore. Per esempio, sostituite questo pezzo di codice

GestoreErrori:
‘Queste istruzioni vengono eseguite quando si verifica un errore.
If Err.Number = 11 Then
‘Divisione per zero.
MsgBox “Si è verificato un errore di divisione per zero. Controllare i valori digitati e riprovare.”
End If

Con

GestoreErrori:
‘Queste istruzioni vengono eseguite quando si verifica un errore.
If Err.Number = 11 Then
‘Divisione per zero.
MsgBox “Si è verificato un errore di divisione per zero. Controllare i valori digitati e riprovare.”
B = 1
Resume
End If

Il nuovo codice, dopo aver visualizzato il messaggio di errore, cambio il valore di B da 0 a 1 e infine, con un Resume, torna all’istruzione che aveva provocato l’errore, cioè C = A / B. Ora la divisione (che è diventata 5 / 1) viene eseguita correttamente, pertanto otterremo:

Adesso provate a sostituire l’istruzione Resume che abbiamo appena scritto con Resume Next: come abbiamo detto, con essa l’esecuzione salta all’istruzione successiva a quella che ha provocato l’errore, quindi C = B / A non verrà più eseguita, ma il programma passerà subito all’istruzione MsgBox “Il risultato della divisione è: ” & C. Modificate il codice come suggerito e osservate il risultato.
L’istruzione Resume Next può anche essere usata insieme all’istruzione On Error: in questo modo si dice al programma che, ogni volta che si verifica un errore, il problema deve essere ignorato e l’esecuzione deve passare all’istruzione successiva. Per fare questo è sufficiente scrivere:

On Error Resume Next

Di solito è sconsigliabile seguire questa strada, perché, non gestendo gli errori, si possono verificare delle situazioni imprevedibili.

 

Both comments and pings are currently closed.

Comments are closed.