JavaScript错误捕获主要靠try...catch语句,可捕获运行时错误(如ReferenceError、TypeError等),但无法捕获SyntaxError等解析阶段错误;支持finally清理资源,throw可主动抛出Error实例或自定义错误类。
JavaScript 中的错误捕获主要靠 try...catch 语句,它能让你在代码出错时不中断整个程序,而是有控制地处理异常。
try 块里放可能出错的代码,catch 块接收并处理抛出的
错误。如果 try 中没出错,catch 就不执行;一旦发生运行时错误(比如引用未定义变量、调用非函数值、网络请求失败等),就会跳转到 catch。
基本写法:
try {
// 可能出错的代码
console.log(a); // a 未声明 → 抛出 ReferenceError
} catch (error) {
// 错误处理逻辑
console.log('出错了:', error.message);
}
catch 后面的参数(如 error)是一个 Error 对象,通常包含 message(错误信息)、name(错误类型名)和 stack(调用栈)。常见内置错误类型包括:
null.toString()
注意:SyntaxError 和某些顶层语法错误(如 if ( 缺少括号)不能被 try...catch 捕获,因为它们发生在代码执行前的解析阶段。
finally 块无论是否出错都会执行,适合做清理工作,比如关闭定时器、重置状态、释放资源等:
let timer = setTimeout(() => {}, 1000);
try {
riskyOperation();
} catch (e) {
console.error(e);
} finally {
clearTimeout(timer); // 总会执行
}
用 throw 可以手动触发错误,配合 try...catch 实现业务逻辑控制:
throw '用户名不能为空'(不推荐,信息太简陋)throw new 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);
}
}