throw 抛出错误会立即终止当前同步执行流程,后续语句不执行;可抛出自定义 error 子类以增强可读性与类型区分;需配合 try…catch 控制中断后流向,且无法中断异步任务。

在 JavaScript 中,通过 throw 抛出自定义错误(如 new Error() 或继承 Error 的类)会立即终止当前执行上下文的同步代码流程,后续语句不再运行——这是中断流程最直接、标准的方式。
使用 throw + Error 实例中断执行
只要抛出一个错误对象(不限于原生 Error),当前函数或同步代码块就会停止执行,并沿调用栈向上寻找最近的 catch。如果没有捕获,就触发全局错误(如 window.onerror 或 unhandledrejection)。
示例:
function processData(data) {
if (!data || typeof data !== 'object') {
throw new Error('数据必须是非空对象');
}
console.log('开始处理...'); // 这行不会执行
return data.id;
}
processData(null); // 抛出错误,控制台输出后停止,不进入 console.log
创建和抛出自定义错误类
为增强可读性和类型区分,可定义继承 Error 的子类。抛出时仍能中断流程,且便于 instanceof 判断或统一错误处理。
建议写法:
- 重写
name和message,确保堆栈信息清晰 - 可添加自定义属性(如
code、details)用于业务逻辑判断 - 构造函数中调用
super(message)并手动赋值this.name
class ValidationError extends Error {
constructor(message, field) {
super(message);
this.name = 'ValidationError';
this.field = field;
}
}
function validateUser(user) {
if (!user.email) {
throw new ValidationError('邮箱不能为空', 'email');
}
return true;
}
配合 try…catch 控制中断后的流向
throw 本身只负责“中断”,真正决定是否继续执行、如何降级或提示用户,靠的是外层的 try…catch。没有 catch,错误会冒泡至顶层并终止脚本(开发时明显,生产环境可能被监控捕获)。
常见做法:
- 在关键业务入口加
try…catch,避免未处理错误导致页面白屏 -
catch中可记录日志、显示友好提示、回滚状态,再选择return或重新throw - 异步代码中(如
async/await),throw会拒绝 Promise,需用catch或.catch()捕获
注意:throw 不会中断异步回调或事件循环中的其他任务
throw 只影响当前调用栈的同步执行流。它无法中断已加入事件队列的定时器、fetch 回调、setTimeout 等——这些属于独立的执行上下文。
例如:
console.log('1');
throw new Error('中断这里');
console.log('2'); // 不会执行
setTimeout(() => {
console.log('3'); // 仍会执行,不受上面 throw 影响
}, 0);
若需取消异步操作,请配合 AbortController、标志位或 Promise 取消模式,而非依赖 throw。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











