JavaScript错误捕获主要靠try...catch语句,可捕获运行时错误(如ReferenceError、TypeError等),但无法捕获SyntaxError等解析阶段错误;支持finally清理资源,throw可主动抛出Error实例或自定义错误类。

JavaScript 中的错误捕获主要靠 try...catch 语句,它能让你在代码出错时不中断整个程序,而是有控制地处理异常。
try catch 基本结构和用法
try 块里放可能出错的代码,catch 块接收并处理抛出的错误。如果 try 中没出错,catch 就不执行;一旦发生运行时错误(比如引用未定义变量、调用非函数值、网络请求失败等),就会跳转到 catch。
基本写法:
try {
// 可能出错的代码
console.log(a); // a 未声明 → 抛出 ReferenceError
} catch (error) {
// 错误处理逻辑
console.log('出错了:', error.message);
}
catch 参数和常见错误类型
catch 后面的参数(如 error)是一个 Error 对象,通常包含 message(错误信息)、name(错误类型名)和 stack(调用栈)。常见内置错误类型包括:
立即学习“Java免费学习笔记(深入)”;
- ReferenceError:引用了不存在的变量或常量
-
TypeError:操作了不支持该操作的数据类型,比如
null.toString() - SyntaxError:代码语法错误(但一般在解析阶段就报错,无法被 try catch 捕获)
- RangeError:数值超出有效范围,比如递归太深、数组长度非法
注意:SyntaxError 和某些顶层语法错误(如 if ( 缺少括号)不能被 try...catch 捕获,因为它们发生在代码执行前的解析阶段。
可选的 finally 块
finally 块无论是否出错都会执行,适合做清理工作,比如关闭定时器、重置状态、释放资源等:
let timer = setTimeout(() => {}, 1000);
try {
riskyOperation();
} catch (e) {
console.error(e);
} finally {
clearTimeout(timer); // 总会执行
}
主动抛出错误和自定义错误
用 throw 可以手动触发错误,配合 try...catch 实现业务逻辑控制:
- 抛出字符串:
throw '用户名不能为空'(不推荐,信息太简陋) - 抛出 Error 实例:
throw new Error('用户名不能为空')(推荐,保留堆栈) - 抛出自定义错误类(继承 Error):便于区分错误类型和统一处理
例如:
class ValidationError extends Error {
constructor(message) {
super(message);
this.name = 'ValidationError';
}
}
try {
if (!username) throw new ValidationError('用户名必填');
} catch (e) {
if (e instanceof ValidationError) {
alert(e.message);
}
}











