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:
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.
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)
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)
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)
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)
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;
}
}
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;
}
}