Come promesso nel precedente post ora vedremo alcuni esempi dell'uso delle funzioni che Gambas offre per la gestione degli errori.
Immaginiamo ad esempio di voler eliminare un file il cui percorso è contenuto nella variabile di tipo stringa di nome $indirizzo. La prima cosa da fare e indicare, mediante il comando KILL il file da eliminare:
KILL $indirizzo
Così come è scritta l'istruzione, non si potrà mai sapere se essa sarà eseguita con esito positivo o se solleverà un'eccezione. Si usa pertanto la seguente sintassi:
TRY KILL $indirizzo
In questo modo diciamo a gambas di tentare l'esecuzione di KILL e di restituirci l'eventuale errore se esso dovesse presentarsi. Come si fa allora ad analizzare l'esito? Come detto in precedenza si ricorre al valore che in questo momento assumerà ERROR. Essa potrà valere o TRUE, sapremo così che c'è stato un errore, o FALSE, esplicando la riuscita dell'istruzione.
Si usa pertanto la seguente sintassi:
IF ERROR THEN PRINT "Errore nell'istruzione kill"
Si vede facilmente che IF analizza lo stato di ERROR e se esso è TRUE allora stamperà nel terminale la stringa racchiusa tra gli apici.
Immaginiamo ora di voler sapere quale errore in particolare si sia presentato. Per il nostro scopo basterà utilizzare le funzioni interne alla classe Error.
Analizziamo la seguente sintassi
TRY KILL $indirizzo
IF ERROR THEN PRINT Error.Text
Con queste due righe di codice abbiamo detto a gambas di provare a rimuovere il file $indirizzo e di scrivere nel terminale il testo dell'errore, se presente, così come esso viene restituito dal sistema. Infatti Error.Text conterrà il testo dell'errore qualora esso esista.
In modo analogo possiamo analizzare il codice colpevole dell'errore e il punto del sorgente in cui esso si è presentato. Basterà infatti analizzare rispettivamente le funzioni Error.Code ed Error.Where. Un esempio di codice potrebbe essere:
TRY KILL $indirizzo
IF ERROR THEN
PRINT "Testo errore: " & Error.Text
PRINT "Codice errore: " & Error.Code
PRINT "Errore presente in: " & Error.Where
END IF
L'uso combinato di TRY ed ERROR è molto semplice e permette al programmatore di ovviare con facilità ad eventuali problemi che potrebbero causare il crash del programma.
Vediamo ora l'uso di FINALLY e CATCH
Come si è detto FINALLY, posto prima di un blocco di codice, permette di eseguirlo ignorando gli errori che invece di essere analizzati vengono semplicemente propagati fino alla fine del blocco. L'uni modo che si ha per analizzare gli errori è l'uso di CATCH. Vediamo un codice d'esempio prelevato dalla documentazione di gambas e leggermente modificato:
SUB PrintFile($indirizzo AS STRING)
DIM hFile AS File
DIM $Stringa AS STRING
OPEN FileName FOR READ AS #hFile
WHILE NOT EOF(hFile)
LINE INPUT #hFile, $Stringa
PRINT $Stringa
WEND
FINALLY ' Lo esegue sempre
CLOSE #hFile
CATCH ' Esegue solo se c'è un errore
PRINT "Non è possibile stampare il file "; $indirizzo
END
Il codice è facilmente comprensibile. Esso si limita all'apertura di un file di testo da stampare riga per riga nel terminale. Solo alla fine si usa FINALLY per provare a chiudere il file. Se tale operazione non è consentita (e solo in quel caso) esegue l'istruzione che succede CATCH.
Anche l'uso di queste ultime due istruzioni è tanto semplice quanto potente e permette di scrivere sempre codice di ottima qualità con strumenti di facile utilizzo.