JavaScript, HTML, CSS e... !
6 commenti

Un modo elegante e funzionale per la gestione degli errori

Gestire le eccezioni negli script di Google Apps Script con Try e Catch

Un modo elegante e funzionale per gestire errori ed eccezioni all'interno degli script in Apps Script è quello di utilizzare il blocco di codice try-catch.
Premetto che, ossessionato dalla generazione di errori prodotti dagli script, nei codici che produco ho la tendenza a cercare di prevedere tutte le casistiche che possono provocarne uno in modo da mettere in sicurezza gli script da problematiche dovute lato macchina (limiti dello strumento, parametri inattesi, ecc...) o particolarità nel flusso che possono eventualmente essere provocate lato utilizzatore. Ci sono tuttavia dei casi dove non sempre è prevedibile la causa di un'eccezione e non sempre pertanto è facile trovarne una soluzione, senza contare quei casi in cui l'eccezione può essere parte del funzionamento (un esempio può essere l'interrogazione di url noti tramite URLFetch che talvolta può non restituire il contenuto corretto per problemi nel sito bersaglio o nella pagina desiderata).

Utilizzando pertanto il blocco try-catch è possibile richiedere allo script di provare ad eseguire una determinata porzione di codice e nel caso questa non vada a buon fine prevedere un "piano b" (che può essere l'esecuzione di script per riprovare ad eseguire nuovamente l'operazione così come l'invio di una mail per comunicare all'operatore il motivo dell'eccezione e dove localizzarla o ancora salvare le informazioni dell'errore in uno Spreadsheet, ecc...).

Un esempio di utilizzo del blocco di codice try-catch è il seguente:

function myFunction() {
  try {
    // codice vario dello script
    // ...
    
    // funzione appositamente non definita per generare un errore
    var res = badFunction();
  } catch (e) {
    MailApp.sendEmail("mio-indirizzo@gmail.com", "Rapporto errori", 
      "\r\nMessage: " + e.message
      + "\r\nFile: " + e.fileName
      + "\r\nLine: " + e.lineNumber);
  }
}

Nelle righe commentate all'interno del blocco "try" c'è il nostro ipotetico codice dell'applicazione seguito da una chiamata ad una funzione appositamente non definita per generare un errore, in questo modo l'esecuzione dello script passa al blocco di codice "catch" che invia una mail all'indirizzo specificato fornendo indicazioni sul tipo di errore (e.message), il nome del file in cui si è verificato (e.fileName) ed il relativo numero di riga all'interno del codice (e.lineNumber).

Eseguendo lo script non verrà restituito alcun riscontro a livello di interfaccia, tuttavia nella casella di posta specificata verrà recapitato il seguente messaggio:



try catch dettagli eccezione inviate per email

Fig. 1 - Dettagli dell'eccezione rilevata tramite l'uso del blocco try catch ricevuto al proprio indirizzo email


Nel caso in cui farsi inviare una mail possa diventare una pratica poco gestibile per l'eventuale elevato numero di segnalazioni, il consiglio è quello di far scrivere questi messaggi in uno Spreadsheet al fine di utilzzarlo come file di log delle eccezioni.

Tags

Michele Pisani

Michele Pisani

Sviluppatore Javascript ed esperto in Digital Analytics

L'esperienza nel settore Digital Analytics unita ad anni di sviluppo in Javascript ha trovato la massima espressione in Google Apps Script che mi ha permesso, con estrema facilità e poche righe di codice, di realizzare potenti applicazioni interattive e processi automatizzati integrati con i prodotti della G Suite.

Come contattarmi
scrivi un commento

6 Commenti

  1. Thursday, April 6, 2023 alle ore 12:33 marcello

    Mi sono sempre posto questa domanda: Se inserisco nel il blocco try...catch una porzione di codice che esegue diverse azioni (A,B,C...) , in caso di errore avvenuto dopo l'esecuzione di alcune di queste azioni (A,B) il sistema ripristina tutto nelle condizioni iniziali prima delle esecuzioni già avvenute? (A,B). In parole povere, funziona come nelle TRANSAZIONI in SQL? (BEGIN TRANSACTION...END TRANSACTION)

    Rispondi a questo commento
  2. Thursday, April 6, 2023 alle ore 12:34 marcello

    Mi sono sempre posto questa domanda: Se inserisco nel il blocco try...catch una porzione di codice che esegue diverse azioni (A,B,C...) , in caso di errore avvenuto dopo l'esecuzione di alcune di queste azioni (A,B) il sistema ripristina tutto nelle condizioni iniziali prima delle esecuzioni già avvenute? (A,B). In parole povere, funziona come nelle TRANSAZIONI in SQL? (BEGIN TRANSACTION...END TRANSACTION)

    Rispondi a questo commento
  3. Thursday, April 6, 2023 alle ore 12:35 marcello

    Mi sono sempre posto questa domanda: Se inserisco nel il blocco try...catch una porzione di codice che esegue diverse azioni (A,B,C...) , in caso di errore avvenuto dopo l'esecuzione di alcune di queste azioni (A,B) il sistema ripristina tutto nelle condizioni iniziali prima delle esecuzioni già avvenute? (A,B). In parole povere, funziona come nelle TRANSAZIONI in SQL? (BEGIN TRANSACTION...END TRANSACTION)

    Rispondi a questo commento
  4. Thursday, April 6, 2023 alle ore 12:35 marcello

    Mi sono sempre posto questa domanda: Se inserisco nel il blocco try...catch una porzione di codice che esegue diverse azioni (A,B,C...) , in caso di errore avvenuto dopo l'esecuzione di alcune di queste azioni (A,B) il sistema ripristina tutto nelle condizioni iniziali prima delle esecuzioni già avvenute? (A,B). In parole povere, funziona come nelle TRANSAZIONI in SQL? (BEGIN TRANSACTION...END TRANSACTION)

    Rispondi a questo commento
  5. Thursday, April 13, 2023 alle ore 17:49 Stefano

    Con la versione V8 non si può più fare così perchè error ha rimosso fileName e lineNumber
    bisogna usare :
    function myFunction() {
    try {
    // codice vario dello script
    // ...

    // funzione appositamente non definita per generare un errore
    var res = badFunction();
    } catch (e) {
    MailApp.sendEmail("mio-indirizzo@gmail.com", "Rapporto errori",
    "
    Message:
    " + e.stack;
    }
    }

    Rispondi a questo commento
  6. Thursday, April 13, 2023 alle ore 17:49 Stefano

    Con la versione V8 non si può più fare così perchè error ha rimosso fileName e lineNumber
    bisogna usare :
    function myFunction() {
    try {
    // codice vario dello script
    // ...

    // funzione appositamente non definita per generare un errore
    var res = badFunction();
    } catch (e) {
    MailApp.sendEmail("mio-indirizzo@gmail.com", "Rapporto errori",
    "
    Message:
    " + e.stack;
    }
    }

    Rispondi a questo commento

Scrivi un commento

Il tuo indirizzo email non sarà pubblicato.I campi contrassegnati da un * sono obbligatori
Puoi utilizzare i seguenti tag nei commenti:
[bold]testo[/bold] se vuoi evidenziare un testo con il grassetto[code]function helloworld() { }[/code] se vuoi pubblicare una porzione di codice[url]https://www.appsscript.it[/url] se devi riferirti ad un indirizzo web