当我的代码中发生异常时,我试图获取堆栈跟踪(及其他详细信息)。为此,使用以下代码来工作:
function catchException() {
var errLog = [];
try {
var temp;
temp.split(",");
} catch (exception) {
for (var property in exception) {
errLog.push(property + ": " + exception[property]);
}
}
return errLog;
}
但是自从Google Apps脚本上的v8运行时更新以来,这不会返回异常对象的任何属性。
在v8运行时中,我可以在上面的代码中获得堆栈跟踪,如果我使用exception [“ stack”],则可以获得堆栈跟踪。
但是我希望我可以避免使用字符串(“ stack”),并且还可以获取异常的所有其他属性,而我可能不知道该属性的名称。
(for ... in ...){}构造在这种情况下似乎不起作用。
我如何访问异常对象的属性?
((所有属性,不使用属性名称)
for..in
仅枚举配置为可枚举的属性;异常的“堆栈”属性不可枚举(可以使用Object.getOwnPropertyDescriptor(exception, "stack")
进行检查)。您可以使用Object.getOwnPropertyNames
获取对象的所有属性名称,无论是否可枚举:
let keys = Object.getOwnPropertyNames(exception);
for (let key of keys) {
console.log(key + ": " + exception[key]);
}
注意,顾名思义,它列出了对象的own属性。如果您还对从其原型继承的属性感兴趣,则可以使用循环来迭代原型链:
function DumpAllProperties(o) {
let receiver = o;
while (o) {
for (let key of Object.getOwnPropertyNames(o)) {
console.log(key + " -> " + receiver[key]);
}
o = Object.getPrototypeOf(o);
}
}
Error.fileName
和Error.lineNumber
在V8中不再受支持。而是有Error.prototype.stack
。您可以创建一个自定义错误来添加自己的属性。
参考this section of their V8 migration guide。摘录-
在V8运行时中,标准JavaScript错误对象不支持
fileName
或lineNumber
作为构造函数参数或对象属性。将脚本迁移到V8时,请删除对
Error.fileName
和Error.lineNumber
。替代方法是使用
Error.prototype.stack
。这个堆栈也是非标准,但Rhino和V8均受支持。