JavaScript中catch可解构Error对象的message、name等属性,但需确保错误为Error实例;非Error类型需用默认值或instanceof判断;自定义错误可解构额外字段如statusCode;stack属性跨环境不一致,不宜依赖其结构。

在 JavaScript 中,catch 块接收的错误对象(通常叫 error)是一个标准的 Error 实例,它有 message、name、stack 等属性。你可以在 catch 中直接对它进行解构,但要注意:**必须确保该对象确实拥有你要解构的属性,否则会得到 undefined**。
直接解构常见属性
最常用的是提取 message 和 name:
try {
throw new Error('网络请求失败');
} catch ({ message, name }) {
console.log(name); // "Error"
console.log(message); // "网络请求失败"
}
安全解构(避免报错)
如果错误可能不是标准 Error 对象(比如抛出的是字符串、数字或 null),直接解构会报错(如 Cannot destructure property 'message' of 'undefined' or 'null')。此时应先做类型判断或使用默认值:
- 用逻辑或提供默认空对象:
catch (err) { const { message = '', name = 'UnknownError' } = err || {}; } - 用
instanceof Error判断后再解构:
try {
throw 'oops';
} catch (err) {
if (err instanceof Error) {
const { message, stack } = err;
console.log(message, stack);
} else {
console.log('非 Error 类型错误:', err);
}
}
解构自定义错误中的额外字段
如果你抛出的是带自定义属性的错误(例如 HTTP 错误码),可以一并解构:
class ApiError extends Error {
constructor(message, statusCode) {
super(message);
this.statusCode = statusCode;
}
}
try {
throw new ApiError('服务不可用', 503);
} catch ({ message, statusCode, name }) {
console.log(`${name}(${statusCode}): ${message}`);
// 输出:ApiError(503): 服务不可用
}
注意:不能解构 stack 并期望跨环境一致
stack 属性是非标准的(尽管所有主流引擎都支持),且格式因运行时而异。解构它没问题,但不要依赖其结构做关键逻辑判断。另外,某些环境(如某些打包配置或严格模式)可能不暴露 stack。


















