在Web应用程序中尝试/捕获错误处理

时间:2018-03-22 17:44:25

标签: google-apps-script

我注意到,当Google Apps脚本中的try / catch块中出现错误时,Logger.log(e instanceof Error)返回true。但是,当同一个对象在catch语句中传递回客户端时,它会记录false

GAS示例

function isValid() {
  return false
}

function testing() {
  try {
    if(!isValid()) { throw new Error("failure") }
    return "success"
  } catch(e) {
    Logger.log(e instanceof Error) // true
    return e // false in the client when tested with console.log(e instanceof Error)
  }
}

客户端

function foo() {
 google.script.run.withSuccessHandler(onSuccess).withFailureHandler(onFailure).testing();
}

function onSuccess(e) {
  console.log(e instanceof Error) // false
  console.log(e) // null
}

function onFailure(e) {
  console.log(e instanceof Error) // no result
}

有没有更好的方法来测试脚本文件返回的错误?

2 个答案:

答案 0 :(得分:1)

在客户端,您在调用.run.myFunction()代码时使用.withFailureHandler(...)。失败处理程序是客户端代码中的一个函数,如果在服务器端代码中抛出异常(即错误)而未处理,则会调用该函数。

只有在抛出异常时才会调用失败处理程序。否则,成功处理程序将接收服务器端函数的return值。

.GS

function myFn() {
  try {
    throw new Error("failure");
  }
  catch (e) {
    Logger.log(e);
    // Must rethrow to activate the client's FailureHandler function.
    throw e;
  }
  return "success"
}

html的

function foo() {
  google.script.run.withFailureHandler(logError).withSuccessHandler(useReturnValue).myFn();
}
function logError(error) {
  console.log(error);
}
function useReturnValue(value) {
  // do stuff
}

在客户端控制台中,您将看到记录错误。

答案 1 :(得分:0)

问题是您的e变量没有分配对象。请注意,官方指南使用error作为错误处理函数参数,但您的代码使用data,而不是在您使用e的控制台语句中使用它。

在客户端代码中,将data替换为e,反之亦然。

来自https://developers.google.com/apps-script/guides/html/reference/run#withFailureHandler(Function)

Code.gs

function doGet() {
  return HtmlService.createHtmlOutputFromFile('Index');
}

function getUnreadEmails() {
  // 'got' instead of 'get' will throw an error.
  return GmailApp.gotInboxUnreadCount();
}

的index.html

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <script>
      function onFailure(error) {
        var div = document.getElementById('output');
        div.innerHTML = "ERROR: " + error.message;
      }

      google.script.run.withFailureHandler(onFailure)
          .getUnreadEmails();
    </script>
  </head>
  <body>
    <div id="output"></div>
  </body>
</html>