无法在v8运行时中访问异常属性(Google Apps脚本)

问题描述 投票:0回答:2

当我的代码中发生异常时,我试图获取堆栈跟踪(及其他详细信息)。为此,使用以下代码来工作:

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 ...){}构造在这种情况下似乎不起作用。

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

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

debugging google-apps-script v8
2个回答
1
投票

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);
  }
}

0
投票

Error.fileNameError.lineNumber在V8中不再受支持。而是有Error.prototype.stack。您可以创建一个自定义错误来添加自己的属性。

参考this section of their V8 migration guide。摘录-

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

将脚本迁移到V8时,请删除对Error.fileNameError.lineNumber

替代方法是使用Error.prototype.stack。这个堆栈也是非标准,但Rhino和V8均受支持。

© www.soinside.com 2019 - 2024. All rights reserved.