TRASLOCO
Sempre mosso dalla voglia di allontanarmi da Google e dai suoi servizi, ho finalmente deciso che dopo diversi anni la piattaforma di questo piccolo spazio andava cambiata. Finalmente il blo cambia casa. Se volete trovarmi potete recarvi al nuovo indirizzo

martedì 26 gennaio 2010

Didattica Gambas: Gestione errori (parte 2)


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.