javascript中推荐用throw new error()抛出错误,因其自带堆栈信息;也可抛字符串或对象但不推荐;自定义错误类可继承error以支持类型判断和扩展属性。

在 JavaScript 中,使用 throw 关键字可以主动抛出一个错误,包括自定义错误。核心是:抛出的可以是任意值(字符串、数字、对象等),但为了语义清晰和便于捕获处理,推荐抛出 Error 实例或其子类实例。
抛出基础自定义错误(字符串或普通对象)
虽然不推荐,但语法上完全可行:
-
throw "用户名不能为空";—— 抛出字符串,简单直接,但缺少堆栈信息和标准属性 -
throw { code: 400, message: "参数校验失败" };—— 抛出普通对象,可携带结构化数据,但仍无stack等原生错误特性
推荐方式:抛出 Error 实例(含自定义消息)
这是最常见也最规范的做法,能保留完整的错误上下文:
-
throw new Error("网络请求超时");—— 自动附带调用位置的堆栈跟踪(stack) -
throw new Error(`用户ID ${id} 不存在`);—— 支持模板字符串,动态构建错误信息
进阶:创建并抛出自定义错误类
当需要区分错误类型或携带额外字段(如 statusCode、errorCode)时,可继承 Error:
class ValidationError extends Error {
constructor(message, field) {
super(message);
this.name = "ValidationError";
this.field = field;
this.statusCode = 400;
}
}
// 使用
throw new ValidationError("邮箱格式不正确", "email");
这样在 catch 块中可通过 err instanceof ValidationError 精准判断类型,也便于统一错误处理逻辑。
配合 try...catch 捕获自定义错误
抛出后需合理捕获才有意义:
try {
if (!username) {
throw new Error("用户名为必填项");
}
// 其他逻辑...
} catch (err) {
console.error("捕获到错误:", err.message);
console.error("错误堆栈:", err.stack);
// 可根据 err.name 或 err instanceof 进行分支处理
}
注意:throw 后的代码不会执行,控制权立即交由最近的 catch 或终止当前执行环境。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











