JavaScript中如何打印Error对象的全部属性
问题原因
Error 对象的内置属性(如 name、message、stack 等)默认是不可枚举的,你所用的 for...in 循环只会遍历可枚举的属性,因此会漏掉大量内置属性,部分特殊错误的非枚举专属属性(比如 OpenSSL 错误的 opensslErrorStack)也无法通过该方式遍历到。
可用解决方案
方法1:遍历所有自有属性(包含不可枚举属性)
使用 Object.getOwnPropertyNames() 可以获取对象的所有自有字符串属性,不受可枚举性限制,实现代码如下:
process.on('uncaughtException', function(err) { const allProps = Object.getOwnPropertyNames(err); for (const prop of allProps) { console.log(`${prop}: ${err[prop]}`); } });
方法2:同时兼容Symbol类型属性
如果需要包含以 Symbol 为键的属性,可以合并 Object.getOwnPropertyNames() 和 Object.getOwnPropertySymbols() 的返回结果:
process.on('uncaughtException', function(err) { const allKeys = [ ...Object.getOwnPropertyNames(err), ...Object.getOwnPropertySymbols(err) ]; for (const key of allKeys) { console.log(`${String(key)}: ${err[key]}`); } });
方法3:Node.js环境快速调试方案
如果是在 Node.js 环境下仅做调试使用,可以直接调用内置的 util.inspect 方法,配置开启不可枚举属性展示即可直接输出完整的错误信息:
const util = require('util'); process.on('uncaughtException', function(err) { // showHidden设为true即可展示不可枚举属性,depth设为null会全量展开嵌套内容 console.log(util.inspect(err, { showHidden: true, depth: null })); });
该方法会完整输出所有内置属性、自定义专属属性,包括 OpenSSL 错误的 opensslErrorStack 等特殊字段。
内容的提问来源于stack exchange,提问作者Aero Wang
相关产品推荐
相关产品推荐

