JavaScript 中应使用 new Error 创建结构化错误对象并封装自定义错误类,配合 instanceof 精准捕获处理;throw 是同步中断操作,需在 async 函数或 try...catch 中合理使用以避免未捕获异常。

在 JavaScript 中,throw 语句用于手动抛出异常,配合 try...catch 可以实现对业务逻辑错误的精准捕获与处理。关键不是“抛出”,而是“抛什么”和“怎么接住”。
抛出一个有意义的错误对象
不要只 throw 字符串(如 throw "用户名不能为空"),那样会丢失堆栈信息、类型标识和扩展能力。推荐创建标准 Error 实例,并可添加自定义属性:
- 使用
new Error(message)保证具备stack和name - 可挂载业务字段,比如
code、field、details - 示例:
throw new Error("登录失败:验证码错误");
或更结构化:const err = new Error("参数校验失败");<br> err.name = "ValidateError";<br> err.code = "VALIDATE_001";<br> err.field = "phone";<br> throw err;
封装业务异常类便于统一管理
当项目变大,建议定义继承自 Error 的自定义错误类,让类型可识别、行为可复用:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 利用
class MyBusinessError extends Error继承原生错误能力 - 在 constructor 中自动设置
this.name和业务字段 - 示例:
class ApiError extends Error {<br> constructor(message, { code = "API_ERROR", status = 500 } = {}) {<br> super(message);<br> this.name = "ApiError";<br> this.code = code;<br> this.status = status;<br> }<br> }<br> // 使用<br> throw new ApiError("接口超时", { code: "TIMEOUT_001", status: 408 });
在 try...catch 中识别并响应业务异常
捕获时可通过 instanceof 或检查 name/code 区分业务异常与系统异常,避免一锅端:
立即学习“Java免费学习笔记(深入)”;
- 优先用
if (error instanceof ApiError)做类型判断 - 也可根据
error.code跳转不同错误提示或重试逻辑 - 示例:
try {<br> await submitForm();<br> } catch (error) {<br> if (error instanceof ValidateError) {<br> showFieldError(error.field, error.message);<br> } else if (error instanceof ApiError && error.code === "TIMEOUT_001") {<br> alert("网络不稳定,请稍后重试");<br> } else {<br> alert("未知错误:" + error.message);<br> }<br> }
注意 throw 的执行时机和边界
throw 是同步中断操作,一旦执行,后续代码不再运行;它不依赖 Promise,但可用于异步流程控制:
- 在 async 函数中 throw,等价于返回一个 rejected Promise
- 不要在事件回调或定时器里 throw 后不 catch,否则变成未捕获异常(Uncaught Error)
- 避免在循环中无条件 throw 多次——通常只需抛出第一个关键错误

















