首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法访问v8运行时中的异常属性

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

Stack Overflow用户
提问于 2020-05-12 08:54:55
回答 2查看 141关注 0票数 1

当代码中出现异常时,我正在尝试获取堆栈跟踪(和其他细节)。要做到这一点,请使用以下代码来工作:

代码语言:javascript
运行
复制
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循环似乎不起作用。

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-12 10:18:15

for..in只枚举配置为可枚举的属性;异常的“堆栈”属性不可枚举(可以与Object.getOwnPropertyDescriptor(exception, "stack")检查)。您可以使用Object.getOwnPropertyNames获取对象的所有属性名称,无论是否可枚举:

代码语言:javascript
运行
复制
let keys = Object.getOwnPropertyNames(exception);
for (let key of keys) {
  console.log(key + ": " + exception[key]);
}

注意,顾名思义,这列出了一个对象自己的属性。如果您也对从其原型继承的属性感兴趣,可以使用一个循环来迭代原型链:

代码语言:javascript
运行
复制
function DumpAllProperties(o) {
  let receiver = o;
  while (o) {
    for (let key of Object.getOwnPropertyNames(o)) {
      console.log(key + " -> " + receiver[key]);
    }
    o = Object.getPrototypeOf(o);
  }
}
票数 4
EN

Stack Overflow用户

发布于 2020-05-12 11:18:21

您可能期望以前出现在错误中的属性,Error.fileNameError.lineNumber在V8中不再受支持。取而代之的是Error.prototype.stack。它不会在错误的可迭代属性下显示。

要迭代Error prototype属性,可以按照以下答案中的代码进行:列出Javascript对象的所有原型属性

错误对象的更改在这部分是他们的V8迁移指南中提到。

在V8运行时,标准JavaScript错误对象不支持将fileNamelineNumber作为构造函数参数或对象属性。 在将脚本迁移到V8时,消除对Error.fileNameError.lineNumber的依赖。 另一种选择是使用Error.prototype.stack。这个堆栈也是非标准的,但在Rhino和V8中都支持.

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61747595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档