try_catch仅捕获同步运行时错误,无法捕获语法错误、未await的Promise拒绝、setTimeout或事件回调中的throw;正确使用需限定于明确可能throw且可响应的场景,如JSON.parse()、深层属性访问、localStorage操作等,并配合async/await处理异步错误。

try...catch 只能捕获同步执行中抛出的运行时错误,对语法错误、未 await 的 Promise 拒绝、setTimeout 或事件回调里的 throw 完全无效——这是写错的第一步。
什么时候必须包 try...catch?
不是所有代码都要套一层。只在明确某行可能 throw,且你有能力响应时才用:
-
JSON.parse():用户输入、localStorage读取、后端返回脏数据时极易抛SyntaxError - 访问深层嵌套属性前:比如
user.profile.address.city,但user或中间某层可能是null;?.解决不了 fallback 场景 -
localStorage.setItem():用户禁用存储、配额超限会抛QuotaExceededError或SecurityError - 调用某些 Web API 同步失败时:如
navigator.clipboard.readText()在非安全上下文或权限拒绝时直接throw
catch 参数怎么写?常见误写有哪些?
catch 后括号里必须是变量名,不是类型声明。运行时写 catch (Error e) 或 catch (e: Error) 是语法错误(TypeScript 编译阶段允许,但 JS 引擎不认):
- ✅ 正确:
catch (error)、catch (err)、catch (e)(推荐用error,DevTools 调试更清晰) - ❌ 错误:
catch (Error error)、catch (error instanceof Error) - 别空
catch:至少写console.error(error),否则错误静默消失,后续排查无从下手 - 想区分错误类型?用
error.name === 'SyntaxError'比error instanceof SyntaxError更稳妥(跨 iframe / 模块时构造函数引用可能不同)
async/await 场景下 try...catch 怎么写才真正生效?
await 会让被 reject 的 Promise 表现得像同步错误,所以 try...catch 对它有效——但前提是,你真 await 了:
立即学习“Java免费学习笔记(深入)”;
- ✅ 正确:
const res = await fetch('/api')→ 网络失败、HTTP 404/500(需手动检查res.ok)都会进catch - ❌ 错误:
fetch('/api').then()套在try里 →catch完全不触发,Promise rejection 仍为unhandled - 注意:
fetch默认不会因 HTTP 状态码 reject,必须自己加判断:if (!res.ok) throw new Error(`HTTP ${res.status}`) - 别把整个函数体塞进
try:只包裹真正可能出错的await行,否则堆栈难定位
最常被忽略的是:异步错误必须显式 await 才能进 catch;而 finally 不是善后万金油,只适合无条件清理(如 setLoading(false)、clearTimeout(timer)),里面 return 或再 throw 会掩盖原始错误。



















