推荐抛出 error 实例,因其自带 message、stack、name 属性并支持 instanceof 判断;不建议 throw 字符串、数字或普通对象,会丢失堆栈信息和标准化接口。

在 JavaScript 中,用 throw 抛出自定义错误,核心是抛出一个 Error 实例(推荐),也可以抛出任意值(如字符串、数字、对象),但不建议——因为非 Error 类型无法被标准错误处理机制(如 catch 中的 error.stack、error.message)完整支持。
✅ 推荐写法:抛出 new Error() 或其子类
这是最规范、调试体验最好的方式:
- 使用
new Error('提示信息')创建标准错误对象 - 错误对象自带
.message、.stack(调用栈)、.name(默认为 "Error") - 可继承
Error自定义错误类型,便于instanceof判断
示例:
throw new Error('用户名不能为空');
或自定义错误类:
class ValidationError extends Error {
constructor(message) {
super(message);
this.name = 'ValidationError';
}
}
// 使用
throw new ValidationError('邮箱格式不正确');
⚠️ 不推荐但语法合法的写法
你可以 throw 字符串、数字、对象等,但会丢失堆栈信息和标准化接口:
-
throw '登录失败';→catch中得到的是字符串,没有.stack -
throw { code: 401, msg: '未授权' };→ 不是 Error 实例,instanceof Error为false
这类写法在大型项目中不利于统一错误捕获、日志上报和调试。
? 实际使用小技巧
- 在函数校验失败时立即 throw,避免后续逻辑执行
- 结合
try...catch捕获并处理,例如:catch (err) { console.error(err.message, err.stack); } - 在 Promise 中 reject 前 throw,会被自动转为 rejected 状态(
Promise.reject(new Error(...))等价于throw new Error(...))
? 如何判断是否是自定义错误?
用 instanceof 最可靠:
try {
riskyOperation();
} catch (err) {
if (err instanceof ValidationError) {
console.log('业务校验错误:', err.message);
} else if (err instanceof TypeError) {
console.log('类型错误');
}
}
不复杂但容易忽略:只要抛的是 Error 实例,就能享受完整的错误追踪能力。别图省事 throw 字符串。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











