当代码中出现异常时,我正在尝试获取堆栈跟踪(和其他细节)。要做到这一点,请使用以下代码来工作:
function catchException() {
var errLog = [];
try {
var temp;
temp.split(",");
} catch (exception) {
for (var property in exception) {
errLog.push(property + ": " + exception[property]);
}
}
return errLog;
}
但是自从Google脚本上的v8运行时更新之后,它就不会返回异常对象的任何属性。
在v8运行时,我可以在上面的代码中获得堆栈跟踪,如果我使用exception["stack"],就可以得到堆栈跟踪。
但我希望能够避免使用字符串("stack"),并获得异常的所有其他属性,这些属性可能不知道属性名。
在这种情况下,for...in循环似乎不起作用。
如何访问异常对象的属性?
(不使用属性名称的所有属性)
发布于 2020-05-12 10:18:15
for..in只枚举配置为可枚举的属性;异常的“堆栈”属性不可枚举(可以与Object.getOwnPropertyDescriptor(exception, "stack")检查)。您可以使用Object.getOwnPropertyNames获取对象的所有属性名称,无论是否可枚举:
let keys = Object.getOwnPropertyNames(exception);
for (let key of keys) {
console.log(key + ": " + exception[key]);
}注意,顾名思义,这列出了一个对象自己的属性。如果您也对从其原型继承的属性感兴趣,可以使用一个循环来迭代原型链:
function DumpAllProperties(o) {
let receiver = o;
while (o) {
for (let key of Object.getOwnPropertyNames(o)) {
console.log(key + " -> " + receiver[key]);
}
o = Object.getPrototypeOf(o);
}
}发布于 2020-05-12 11:18:21
您可能期望以前出现在错误中的属性,Error.fileName和Error.lineNumber在V8中不再受支持。取而代之的是Error.prototype.stack。它不会在错误的可迭代属性下显示。
要迭代Error prototype属性,可以按照以下答案中的代码进行:列出Javascript对象的所有原型属性
错误对象的更改在这部分是他们的V8迁移指南中提到。
在V8运行时,标准JavaScript错误对象不支持将
fileName或lineNumber作为构造函数参数或对象属性。 在将脚本迁移到V8时,消除对Error.fileName和Error.lineNumber的依赖。 另一种选择是使用Error.prototype.stack。这个堆栈也是非标准的,但在Rhino和V8中都支持.
https://stackoverflow.com/questions/61747595
复制相似问题