1

此问题已报告给 Google:https ://issuetracker.google.com/issues/152948662

问题的简短描述

在 Rhino 运行时,如果用户按下工具栏上的“调试”按钮,脚本调试器 (script.google.com) 将在任何包含错误(已处理或未处理)的行处中断。(如果用户按下“运行”按钮,它不会中断)。监视窗口将被激活,用户可以检查发生错误时有效的变量。

在 V8 运行时中,脚本调试器在任何情况下都不会因任何错误而中断。这对于调试非常不方便。

一个可靠地重现问题的小代码示例

示例应按原样或以最少的设置运行,无需外部依赖

function testError() {
  var a = {
    title: function() { console.log('hello world') }
  }
  a.titel(); // rhino would break here because of this (unintentional) typo; V8 will not.
}

哪些步骤将重现该问题?

  1. 创建一个新项目

  2. 将代码插入 Code.gs

  3. 调试代码

什么是预期的输出?你看到了什么呢?如果您看到错误消息,请提供它们。

预期:调试器中断与asdfgh()

实际:调试器退出调试

消息:调试器(非常)将错误简要地显示为祝酒词,并在日志和执行下记录未处理的错误。

请在下面提供任何附加信息:

旁注:对于这个错误并不重要。只是额外的信息仅供参考。不要让这分散你的注意力或绊倒你

如果可以修复此错误,我可以使用我自己开发的函数,该函数有效地允许我在代码中的任何位置都有“断点”,从而绕过 GAS 调试器的另一个错误(断点仅在当前文件上命中):

Break(condition, watch) {
  try {
    if(!App.Objects.isUndefined(condition) && !condition)
      return false;
    // you have to step over until you leave Break(). Run doesn't work from here.
    thisFuncDoesntExist();

  } catch (e) {
    return true;
  }
}

在 Rhino 下,我可以在任何地方调用它,调试器会在那里为我停止。但这只是一个旁注。

4

1 回答 1

4

你应该使用 JS 语句debugger。这是在 Javascript 中插入断点以进行调试的标准方法。在 GAS 中,使用调试按钮运行您的函数,执行将在每个debugger;语句处停止。

例如,您将能够testError像这样更新您的函数:

function testError() {
  var a = 'hello world';
  debugger;
}

在未处理的异常上暂停执行

V8 GAS 运行时调试器不会因异常而暂停。您必须显式插入断点才能暂停正在运行的进程。您可以将函数包装在 atry-catch中,以便在未处理的异常上触发调试器。

function myFunction() {
    try {
        // myFunction body...
    } catch(e) {
        debugger;
    }
}

回滚到 Rhino:

但是,如果您确实需要此功能,您可以切换回旧的运行时。

在清单文件中更改此参数: "runtimeVersion": "DEPRECATED_ES5"

但这是有代价的:您将无法使用现代 JavaScript 语法。

参考:

V8 运行时

于 2020-04-02T08:54:40.707 回答