{"id":197,"date":"2010-01-26T14:42:00","date_gmt":"2010-01-26T14:42:00","guid":{"rendered":"http:\/\/e-ware.org\/blog\/?p=197"},"modified":"2010-01-26T14:42:00","modified_gmt":"2010-01-26T14:42:00","slug":"didattica-gambas-gestione-errori-parte-2","status":"publish","type":"post","link":"http:\/\/e-ware.org\/blog\/didattica-gambas-gestione-errori-parte-2\/","title":{"rendered":"Didattica Gambas: Gestione errori (parte 2)"},"content":{"rendered":"<div><span><br \/>Come promesso nel precedente post ora vedremo alcuni esempi dell&#8217;uso delle funzioni che Gambas offre per la gestione degli errori.<\/p>\n<p>Immaginiamo ad esempio di voler eliminare un file il cui percorso \u00e8 contenuto nella variabile di tipo stringa di nome $<\/span><span>indirizzo<\/span><span>. La prima cosa da fare e indicare, mediante il comando <\/span><span>KILL<\/span><span> il file da eliminare:<\/p>\n<p><\/span><span><\/p>\n<pre>KILL $indirizzo<\/pre>\n<p><\/span><span><br \/>Cos\u00ec come \u00e8 scritta l&#8217;istruzione, non si potr\u00e0 mai sapere se essa sar\u00e0 eseguita con esito positivo o se sollever\u00e0 un&#8217;eccezione. Si usa pertanto la seguente sintassi:<\/p>\n<p><\/span><span><\/p>\n<pre>TRY KILL $indirizzo<\/pre>\n<p><\/span><span><br \/>In questo modo diciamo a gambas di <\/span><span>tentare<\/span><span> l&#8217;esecuzione di KILL e di restituirci l&#8217;eventuale errore se esso dovesse presentarsi. Come si fa allora ad analizzare l&#8217;esito? Come detto in precedenza si ricorre al valore che in questo momento assumer\u00e0 ERROR. Essa potr\u00e0 valere o TRUE, sapremo cos\u00ec che c&#8217;\u00e8 stato un errore, o FALSE, esplicando la riuscita dell&#8217;istruzione.<\/p>\n<p>Si usa pertanto la seguente sintassi:<\/p>\n<p><\/span><span><\/p>\n<pre>IF ERROR THEN PRINT \"Errore nell'istruzione kill\"<\/pre>\n<p><\/span><span><br \/>Si vede facilmente che IF analizza lo stato di ERROR e se esso \u00e8 TRUE allora stamper\u00e0 nel terminale la stringa racchiusa tra gli apici.<\/p>\n<p>Immaginiamo ora di voler sapere quale errore in particolare si sia presentato. Per il nostro scopo baster\u00e0 utilizzare le funzioni interne alla classe <\/span><span>Error<\/span><span>.<\/p>\n<p>Analizziamo la seguente sintassi<\/p>\n<p><\/span><span><\/p>\n<pre>TRY KILL $indirizzo<br>IF ERROR THEN PRINT Error.Text<\/pre>\n<p><\/span><span><br \/>Con queste due righe di codice abbiamo detto a gambas di provare a rimuovere il file $<\/span><span>indirizzo<\/span><span> e di scrivere nel terminale il testo dell&#8217;errore, se presente, cos\u00ec come esso viene restituito dal sistema. Infatti Error.Text conterr\u00e0 il testo dell&#8217;errore qualora esso esista.<br \/>In modo analogo possiamo analizzare il codice colpevole dell&#8217;errore e il punto del sorgente in cui esso si \u00e8 presentato. Baster\u00e0 infatti analizzare rispettivamente le funzioni Error.Code ed Error.Where. Un esempio di codice potrebbe essere:<\/p>\n<pre>TRY KILL $indirizzo<br>IF ERROR THEN<br>  PRINT \"Testo errore: \" & Error.Text<br>  PRINT \"Codice errore: \" & Error.Code<br>  PRINT \"Errore presente in: \" & Error.Where<br>END IF<\/pre>\n<p>L&#8217;uso combinato di TRY ed ERROR \u00e8 molto semplice e permette al programmatore di ovviare con facilit\u00e0 ad eventuali problemi che potrebbero causare il crash del programma.<\/p>\n<p>Vediamo ora l&#8217;uso di <\/span><span>FINALLY<\/span><span> e <\/span><span>CATCH<\/span><span><\/p>\n<p>Come si \u00e8 detto <\/span><span>FINALLY<\/span><span>, 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&#8217;uni modo che si ha per analizzare gli errori \u00e8 l&#8217;uso di <\/span><span>CATCH<\/span><span>. Vediamo un codice d&#8217;esempio prelevato dalla documentazione di gambas e leggermente modificato:<\/p>\n<p><\/span><span><\/p>\n<pre>SUB PrintFile($indirizzo AS STRING)<br><br>  DIM hFile AS File<br>  DIM $Stringa AS STRING<br><br>  OPEN FileName FOR READ AS #hFile<br><br>  WHILE NOT EOF(hFile)<br>      LINE INPUT #hFile, $Stringa<br>      PRINT $Stringa<br> WEND<br><br> FINALLY ' Lo esegue sempre<br>    CLOSE #hFile<br><br> CATCH ' Esegue solo se c'\u00e8 un errore<br>    PRINT \"Non \u00e8 possibile stampare il file \"; $indirizzo<br><br>END<\/pre>\n<p><\/span><span><br \/>Il codice \u00e8 facilmente comprensibile. Esso si limita all&#8217;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 \u00e8 consentita (e solo in quel caso) esegue l&#8217;istruzione che succede CATCH.<\/p>\n<p>Anche l&#8217;uso di queste ultime due istruzioni \u00e8 tanto semplice quanto potente e permette di scrivere sempre codice di ottima qualit\u00e0 con strumenti di facile utilizzo.<br \/><\/span><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Come promesso nel precedente post ora vedremo alcuni esempi dell&#8217;uso delle funzioni che Gambas offre per la gestione degli errori. Immaginiamo ad esempio di voler eliminare un file il cui percorso \u00e8 contenuto nella variabile di tipo stringa di nome $indirizzo. La prima cosa da fare e indicare, mediante il comando KILL il file da [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[52,23,2,4],"tags":[],"class_list":["post-197","post","type-post","status-publish","format-standard","hentry","category-didattica","category-gambas","category-gnulinux","category-opencode"],"views":1362,"_links":{"self":[{"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/posts\/197","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/comments?post=197"}],"version-history":[{"count":0,"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/posts\/197\/revisions"}],"wp:attachment":[{"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/media?parent=197"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/categories?post=197"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/tags?post=197"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}