此问题已报告给Google:https://issuetracker.google.com/issues/152948662
问题的简短描述
在Rhino运行时中,如果用户按下工具栏上的"debug"按钮,脚本调试器(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.
}
哪些步骤将重现问题
创建一个新项目
将代码插入code.gs
调试代码
预期输出是多少?你看到了什么?如果您看到错误消息,请提供它们
预期:调试器与asdfgh()
联机中断
实际:调试器退出调试
消息:调试器(非常(将错误简短地显示为toast,并将未处理的错误记录在日志和执行中。
请提供以下任何附加信息:
旁注:对于这个bug并不重要。仅供参考。不要让这分散你的注意力或绊倒你
如果这个错误可以修复,我可以使用我自己开发的函数,它可以有效地让我在代码中的任何地方都有"断点",从而绕过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运行时调试器不会在出现异常时暂停。您必须显式插入断点才能暂停正在运行的进程。您可以将函数封装在try-catch
中,以便在未处理的异常上触发调试器。
function myFunction() {
try {
// myFunction body...
} catch(e) {
debugger;
}
}
回滚到Rhino:
但是,如果您确实需要此功能,则可以切换回旧的运行时。
在清单文件中更改此参数:"runtimeVersion": "DEPRECATED_ES5"
不过,这是有代价的:您将无法使用现代JavaScript语法。
参考:
V8运行时