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.
}
什么步骤会重现问题?
新建项目
将代码插入Code.gs
调试代码
预期的输出是什么?你看到了什么呢?如果您看到错误消息,请提供它们。
预期:调试器中断 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 语法。
参考:
此问题已报告给 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.
}
什么步骤会重现问题?
新建项目
将代码插入Code.gs
调试代码
预期的输出是什么?你看到了什么呢?如果您看到错误消息,请提供它们。
预期:调试器中断 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 语法。