无法访问 v8 运行时中的异常属性

Unable to access exception properties in v8 runtime

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

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 运行时更新以来,这 return 任何 属性 异常对象都没有。

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

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

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

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

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

for..in只枚举配置为可枚举的属性;异常的 "stack" 属性 不可枚举(您可以使用 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.fileNameError.lineNumber 在 V8 中不再受支持。取而代之的是 Error.prototype.stack。这不会出现在 Error.

的可迭代属性下

要迭代错误原型属性,您可以按照此答案中的代码进行操作:

this section of their V8 migration guide 中提到了对错误对象的更改。

In the V8 runtime, the standard JavaScript Error object doesn't support the fileName or lineNumber as constructor parameters or object properties.

When migrating your script to V8, remove any dependence on Error.fileName and Error.lineNumber.

An alternative is to use the Error.prototype.stack. This stack is also non-standard, but supported in both Rhino and V8.