web-dev-qa-db-fra.com

Exceptions non gérées dans le script Google Apps

J'ai créé une application Web publique avec accès à mes données de feuille de calcul privée. Je peux intercepter et enregistrer des exceptions danstry..catch, mais:

  1. est-il possible d'intercepter toutes les exceptions non gérées, comme les navigateurs window.onerror?
  2. puis-je afficher les journaux d'exceptions non gérées quelque part?
  3. par des exceptions comme "Service invoqué trop de fois" mon application n'est même pas exécutée, donc ici je ne peux certainement pas gérer les exceptions. Existe-t-il des journaux avec ce genre d'exceptions?

Ce sont des questions si simples, donc je suis un peu confus de les poser, mais après des heures de recherche, je n'ai pas pu trouver les réponses.

Merci d'avance.

7
tenbits

Ce sont des problèmes qui sont en cours de résolution. Actuellement, dans le programme d'accès anticipé aux scripts d'applications, deux nouveaux ajouts gèrent ces cas. Le premier est l'intégration native avec la journalisation stackdriver et l'ajout de google.script.run.withLogger().

Tout d'abord, pour l'instant, vous devez demander le PAE:

https://developers.google.com/apps-script/guides/apps-script-eap

Journalisation Stackdriver:

Pour vous connecter à stackdriver, l'objet console a été ajouté côté serveur.

code.gs

console.log('This will log to stackdriver')  

Consultez la documentation pour toutes les méthodes de console.

https://developers.google.com/apps-script/guides/logging#stackdriver_logging

Exemple de la documentation:

function measuringExecutionTime() {
  // A simple INFO log message, using sprintf() formatting.
  console.info('Timing the %s function (%d arguments)', 'myFunction', 1);

  // Log a JSON object at a DEBUG level. The log is labeled
  // with the message string in the log viewer, and the JSON content
  // is displayed in the expanded log structure under "structPayload".
  var parameters = {
      isValid: true,
      content: 'some string',
      timestamp: new Date()
  };
  console.log({message: 'Function Input', initialData: parameters});

  var label = 'myFunction() time';  // Labels the timing log entry.
  console.time(label);              // Starts the timer.
  try {
    myFunction(parameters);         // Function to time.
  } catch (e) {
    // Logs an ERROR message.
    console.error('myFunction() yielded an error: ' + e);
  }
  console.timeEnd(label);     
  }

De plus, vous pouvez également vérifier Log Exceptions Dans les propriétés des scripts. Cela générera une entrée stackdriver chaque fois qu'une erreur se produit dans votre script.

Récupération d'erreur dans une application Web

Pour récupérer dans une application web après un échec, vous avez accès à la méthode withFailureHandler() trouvée dans l'objet google.script.run. Avec cela, vous pouvez enregistrer un rappel dans le cas où votre script frappe une exception.

La documentation complète se trouve à l'adresse suivante:

https://developers.google.com/apps-script/guides/html/reference/run

Si vous effectuez des vérifications côté serveur avec try...catch, Vous obtenez peut-être une exception mais vous la gérez avec élégance. Dans ce cas, withFailureHandler () ne s'exécutera pas et onSuccessHandler () n'est probablement pas le meilleur endroit pour gérer les erreurs. Dans l'EAP, il existe désormais une méthode withLogger pour google.script.run. Pour l'instant il n'y a pas de documentation pour google.script.run.withLogger(). Je l'ai trouvé en fouillant dans devtools. withLogger() vous permet d'enregistrer une fonction comme rappel chaque fois qu'une entrée de driver de pile est créée. Ceci est particulièrement utile lorsque vous avez log exceptions Archivé les propriétés de votre script. En ce sens, c'est un peu comme withFailureHandler() mais il peut être déclenché par n'importe quelle entrée de stackdriver que vous ajoutez via l'objet console côté serveur.

index.html

<script>
  google.script.run
        .withSuccessHandler(function(){console.log('OK')})
        .withFailureHandler(function(e){console.error(e)})
        .withLogger(function(e){console.warn("The following log was generated:"+e)})
        .serverFunctionCall();
</script>

code.gs

function serverFunctionCall(){
   console.log("This log will generate a callback");
   return true;

}
7
Spencer Easton