try...catch 结构中 try 和至少一个 catch 或 finally 是必需的,finally 可选;需区分错误类型处理,async/await 中须 await 才能捕获 Promise 拒绝;应记录完整错误上下文,避免空 catch。

JavaScript 中用 try...catch 捕获并处理运行时错误,避免程序崩溃,同时让异常流程可控、可追踪。
基本结构:try、catch、finally 缺一不可?
try 块放可能出错的代码;catch 接收错误对象并处理;finally 是可选的,无论是否出错都会执行,常用于清理工作(比如关闭定时器、重置状态)。
- 必须有
try和至少一个catch或finally - 只写
try...finally是合法的(适合确保清理逻辑执行,但不干预错误) - 只写
try...catch最常见,用于捕获并响应错误
捕获具体错误类型,别一股脑吞掉
不是所有错误都该被静默处理。建议在 catch 中检查 error.name 或 error.constructor,区分 TypeError、SyntaxError、ReferenceError 等,再决定是修复、提示用户,还是重新抛出。
例如:
立即学习“Java免费学习笔记(深入)”;
try {
JSON.parse('{ "name": }'); // 语法错误
} catch (err) {
if (err instanceof SyntaxError) {
console.error('JSON 格式不对,请检查输入');
} else {
throw err; // 其他错误不处理,继续上抛
}
}
async/await 中 try catch 怎么用?
异步操作(如 fetch、setTimeout 包裹的 Promise)不会触发同步 try 的捕获,除非它被 await。所以 await 后的 Promise 拒绝(reject)会被 catch 捕获。
- 忘记
await→ 错误不会进catch,而是变成未处理的 promise rejection - 多个
await可共用一个try...catch,但要注意错误来源是否明确 - 网络请求失败、超时、解析失败,通常都通过
catch统一处理
示例:
async function loadUser() {
try {
const res = await fetch('/api/user');
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return await res.json();
} catch (err) {
console.warn('加载用户失败:', err.message);
return null;
}
}
别忽略错误细节,log 和上报要带上下文
catch 里的 err 对象包含 message、stack、name,有时还有自定义字段(如 err.status)。直接 console.error(err) 能看到完整堆栈,比只打 err.message 有用得多。
- 生产环境建议用统一错误上报函数,附带 URL、用户操作步骤、时间戳等上下文
- 避免空
catch(即catch {}),这会让问题彻底隐身 - 必要时可在
catch里补充日志,比如 “在保存表单时发生 TypeError”


















