帖子内容
摸🐟: 在较早的时候脚本中捕获抛出错误时,直接输出 err,导致很多人问错误信息中的 [object Object] 是什么。之后更改为输出 JSON.stringify(err),确实解决了部分错误输出显示为 [object Object] 的问题,但造成了错误信息显示为 {} 的问题。 在 @evilbutcher 大佬最近一次 PR 及与大佬讨论中得知,部分错误信息改回输出 err 之后,即可正常显示(如:TypeError: null / undefined is not an object)。 于是转向 MDN 文档求助 JSON.stringify() 具体使用及注意事项,得到如下描述: JSON.stringify()将值转换为相应的JSON格式: • 转换值如果有 toJSON() 方法,该方法定义什么值将被序列化。 • 非数组对象的属性不能保证以特定的顺序出现在序列化后的字符串中。 • 布尔值、数字、字符串的包装对象在序列化过程中会自动转换成对应的原始值。 •undefined、任意的函数以及 symbol 值,在序列化过程中会被忽略(出现在非数组对象的属性值中时)或者被转换成 null(出现在数组中时)。函数、undefined 被单独转换时,会返回 undefined,如JSON.stringify(function(){}) or JSON.stringify(undefined). • 对包含循环引用的对象(对象之间相互引用,形成无限循环)执行此方法,会抛出错误。 • 所有以 symbol 为属性键的属性都会被完全忽略掉,即便 replacer 参数中强制指定包含了它们。 • Date 日期调用了 toJSON() 将其转换为了 string 字符串(同Date.toISOString()),因此会被当做字符串处理。 • NaN 和 Infinity 格式的数值及 null 都会被当做 null。 • 其他类型的对象,包括 Map/Set/WeakMap/WeakSet,仅会序列化可枚举的属性。 由此意识到是内置对象在序列化时会出现问题,因此需要单独解决。 最先想到的解决方式为:err = JSON.stringify(err) == "{}" ? err : JSON.stringify(err) 但此写法仅是表面解决问题,且不确定是否真的能涵盖所有可能的情况,故通过 Google 搜索关键字“内置错误 stringify”,得到一篇感觉可以解决此问题的文章:https://juejin.im/post/6844903944792047623 关键:JSON.stringify(err, Object.getOwnPropertyNames(err), 2) 或:Error.prototype.toJSON = function(){return {message:this.message, stack:this.stack}}(但不建议,因为此方法在原型上作了修改) 由于本人没有系统学习,亦没认真学习 JavaScript,且看文档不仔细导致的此问题影响了脚本使用体验及脚本错误的快速定位,对此感到抱歉,同时感谢 @evilbutcher 大佬的点醒。后续会陆续修改脚本中此问题。 最后想说的是,写脚本的门槛其实很低,像我一样从完全没接触过到写下第一个很简陋的脚本,其实不会花费很多精力,所以大家完全可以自己尝试一下。基本就是看看已有的脚本是怎么写的,然后类似写一个最简单的脚本进行尝试,在此过程中遇到问题就去查文档或者问 Google。当然通过此方法写脚本很有可能就出现一些奇奇怪怪的错误,但是不用担心呀,总会有大佬帮你改正或和你探讨的,有精力的时候去学一些新东西又有什么不好呢。 (其实是最近太忙了想当一个愉快的鸽子🐦,所以催脚本的其实可以尝试一下自己写呀)