1

当我的代码中发生异常时,我正在尝试获取堆栈跟踪(和其他详细信息)。为此,请使用以下代码:

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 Script 上的 v8 运行时更新以来,这不会返回异常对象的任何属性。

在 v8 运行时,我可以在上面的代码中获取堆栈跟踪,如果我使用exception["stack"],我会得到堆栈跟踪。

但我希望我可以避免使用字符串 ( "stack") 并获取我可能不知道属性名称的异常的所有其他属性。

在这种for...in情况下,循环似乎不起作用。

如何访问异常对象的属性?

(所有属性不使用属性名称)

4

2 回答 2

4

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-12T10:18:15.877 回答
3

您可能期待以前出现在错误中的属性,Error.fileName并且Error.lineNumber在 V8 中不再支持。取而代之的是Error.prototype.stack。这不会出现在 Error 的可迭代属性下。

要遍历错误原型属性,您可以按照此答案中的代码:列出 Javascript 对象的所有原型属性

他们的 V8 迁移指南的这一部分提到了对 Error 对象的更改。

在 V8 运行时,标准 JavaScript 错误对象不支持fileNamelineNumber作为构造函数参数或对象属性。

Error.fileName将脚本迁移到 V8 时,删除对和的任何依赖 Error.lineNumber

另一种方法是使用Error.prototype.stack. 这个堆栈也是非标准的,但在 Rhino 和 V8 中都支持。

于 2020-05-12T11:18:21.197 回答