structuredClone 不支持 Error 对象,因其包含不可枚举属性(如 stack)、原型链及内部状态,且未被结构化克隆算法白名单覆盖,故直接抛出 DataCloneError 异常。

JavaScript 的 structuredClone 无法复制 Error 对象,调用时会直接抛出 DataCloneError 异常。
为什么 structuredClone 不支持 Error 对象
structuredClone 基于结构化克隆算法(Structured Clone Algorithm),只支持特定的可序列化类型,如普通对象、数组、Map、Set、Date、RegExp、ArrayBuffer 等。而 Error 实例包含不可枚举属性(如 stack)、原型链信息和内部状态,且未被纳入该算法的白名单中。因此,遇到 Error 时会立即失败。
常见报错示例
执行以下代码会触发异常:
structuredClone(new Error("oops"));
→ 抛出:DOMException: Failed to execute 'structuredClone' on 'Window': Error objects cannot be cloned.
立即学习“Java免费学习笔记(深入)”;
替代方案:手动提取并重建 Error
若需“拷贝” Error,实际是创建一个新 Error 实例,并尽可能复现关键字段。推荐做法如下:
- 提取
message、name和stack(注意:stack 是非标准属性,部分环境可能不可读) - 使用
Object.assign或展开语法继承其他自有属性(如自定义的code、status) - 避免尝试复制原型、不可枚举属性或函数(如
toString)
简单实现示例:
function cloneError(err) {<br> const copy = Object.assign(new Error(err.message), {<br> name: err.name,<br> stack: err.stack,<br> // 复制自定义属性(仅可枚举、非函数)<br> ...Object.getOwnPropertyDescriptors(err)<br> .filter(([_, desc]) => desc.enumerable && typeof desc.value !== "function")<br> .reduce((acc, [key, desc]) => ({ ...acc, [key]: desc.value }), {})<br> });<br> return copy;<br>}
更稳妥的做法:只保留必要字段
生产环境中建议精简处理,避免依赖 stack(因跨环境行为不一致):
- 始终保留
message和name - 显式透传已知的业务字段(如
err.code、err.status) - 放弃
stack或仅在开发环境保留(通过process.env.NODE_ENV === "development"判断)
例如:
function safeCloneError(err) {<br> const plain = { message: err.message, name: err.name };<br> if (err.code !== undefined) plain.code = err.code;<br> if (err.status !== undefined) plain.status = err.status;<br> if (process.env.NODE_ENV === "development" && err.stack) {<br> plain.stack = err.stack;<br> }<br> return Object.assign(new Error(plain.message), plain);<br>}


















