V8 引擎不再因错误而中断

V8 engine no longer breaks on errors

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

问题的简短描述

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

在 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()

实际:调试器退出调试

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

请提供以下任何附加信息:

旁注:对于此错误不重要。仅供参考。不要让这分散您的注意力或绊倒您

如果这个错误可以修复,我可以使用我自己开发的函数,它有效地允许我在代码中的任何地方使用 "breakpoints",从而绕过 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 下,我可以在任何地方调用它,调试器会在那里为我停止。但这只是旁注。

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

例如,您可以像这样更新 testError 函数:

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

暂停执行未处理的异常

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

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

回滚到 Rhino:

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

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

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

参考:

V8 Runtime