try-catch仅捕获运行时同步错误,如ReferenceError、TypeError等;不捕获异步错误、Promise拒绝及顶层SyntaxError。error对象含name、message、stack三字段。异步错误需配合async/await使用try-catch,或在回调中单独处理。

try-catch 能捕获哪些错误
它只捕获**运行时同步错误**,比如 ReferenceError、TypeError、SyntaxError(仅在 eval 中)、RangeError 等。但不会捕获:
– 异步错误(如 setTimeout 或 fetch 中抛出的错误)
– Promise 拒绝(需用 .catch() 或 await + try-catch)
– 语法错误(不在 eval 内的顶层 SyntaxError 会直接中断执行,无法被包围)
基本写法与 error 对象的关键字段
catch 块接收一个参数(通常叫 error),它至少包含三个可用属性:message(错误描述)、name(错误类型名)、stack(调用栈)。注意:不同浏览器对 stack 格式支持略有差异,不要依赖其固定结构做逻辑判断。
try {
nonExistentFunction();
} catch (error) {
console.log(error.name); // "ReferenceError"
console.log(error.message); // "nonExistentFunction is not defined"
console.log(error.stack); // 包含文件名、行号等(开发环境有用,生产慎用)
}
如何正确处理异步操作中的错误
直接在 try 里写 fetch 或 setTimeout 不会捕获其内部错误。必须配合 async/await 才能让 try-catch 生效;若用回调,则需在回调内单独处理。
- ✅ 正确(
await让 Promise rejection 转为 throw):async function loadData() { try { const res = await fetch('/api/data'); if (!res.ok) throw new Error(`HTTP ${res.status}`); return await res.json(); } catch (error) { console.error('加载失败:', error.message); } } - ❌ 错误(
fetch返回 Promise,但没await,错误不会进catch):try { fetch('/api/data').then(r => r.json()).catch(e => console.error(e)); } catch (e) { // 这里永远进不来 }
不要忽略 error.name 和具体类型判断
盲目统一处理所有错误容易掩盖真正问题。例如网络超时和 JSON 解析失败应区别对待——前者可重试,后者说明接口返回异常。用 instanceof 或比对 error.name 更稳妥:
立即学习“Java免费学习笔记(深入)”;
try {
JSON.parse(invalidJson);
} catch (error) {
if (error instanceof SyntaxError) {
console.warn('JSON 格式错误,跳过解析');
} else if (error.name === 'TypeError') {
console.error('传入了非字符串参数');
}
}
注意:跨 iframe 或某些打包环境可能让 instanceof 失效,此时优先用 error.name === 'SyntaxError'。










