Promise中reject应传递带属性的Error实例或自定义错误类,确保包含message、status、code等上下文字段,避免字符串或普通对象;自定义错误类需继承Error并调用super(message)以保留堆栈和语义完整性。

在 Promise 中 reject 时传递详细错误对象,关键不是简单 throw 一个字符串,而是创建并传入一个结构清晰、包含足够上下文信息的 Error 实例(或自定义错误类实例)。
使用标准 Error 构造函数添加 message 和属性
JavaScript 的 Error 对象本身支持扩展属性。你可以在 new Error() 后直接挂载额外字段,这些字段在 catch 中可直接访问:
const fetchData = () => {
return new Promise((resolve, reject) => {
setTimeout(() => {
const error = new Error("Network request failed");
error.status = 503;
error.code = "SERVICE_UNAVAILABLE";
error.timestamp = new Date().toISOString();
error.url = "https://api.example.com/data";
reject(error);
}, 100);
});
};
fetchData()
.catch(err => {
console.log(err.message); // "Network request failed"
console.log(err.status); // 503
console.log(err.code); // "SERVICE_UNAVAILABLE"
console.log(err.url); // "https://api.example.com/data"
});
定义自定义错误类提升类型安全和复用性
对于复杂项目,推荐封装专用错误类。它能明确语义、统一结构,并便于 instanceof 判断:
class ApiError extends Error {
constructor(message, { status, code, details, url } = {}) {
super(message);
this.name = "ApiError";
this.status = status;
this.code = code;
this.details = details;
this.url = url;
this.timestamp = new Date().toISOString();
}
}
// 使用
Promise.reject(new ApiError("Timeout", {
status: 0,
code: "TIMEOUT_ERROR",
url: "/users"
}));
在 async/await 中保持错误细节不丢失
用 await 调用 Promise 时,reject 的错误对象会原样抛出。只要 reject 传的是带属性的 Error 实例,try/catch 捕获到的就是完整对象:
立即学习“Java免费学习笔记(深入)”;
async function loadUser(id) {
try {
const res = await fetch(`/api/users/${id}`);
if (!res.ok) {
const error = new Error(`HTTP ${res.status}`);
error.status = res.status;
error.statusText = res.statusText;
throw error; // 这里 throw 的就是带属性的 Error
}
return await res.json();
} catch (err) {
console.error("Failed to load user:", err.message, err.status);
throw err; // 向上透传,保留全部字段
}
}
避免常见误区
以下做法会丢失结构化信息或降低可调试性:
- ❌
reject("Something went wrong")—— 字符串无法添加属性,也无法 instanceof 判断 - ❌
reject({ message: "...", code: 500 })—— 普通对象没有堆栈(stack)、name 等 Error 特性,且err instanceof Error为 false - ❌ 忘记调用
super(message)在自定义错误类中 —— 导致err.message为空,console.error(err)输出不完整


















