try-catch仅捕获同步错误,需配合await才能捕获promise拒绝;.then().catch()是专为异步设计的链式错误处理机制;async/await+try-catch逻辑清晰、调试友好,适合多步依赖场景。

try-catch 本身不处理异步错误,只有配合 async/await 才能自然捕获 Promise 拒绝;而 Promise 链式结构(.then().catch())是专为异步流程设计的错误处理机制,两者定位不同、适用场景明确。
try-catch 只对同步代码生效
它本质是 JavaScript 的同步异常拦截机制。哪怕你在 try 块里调用一个返回 Promise 的函数,只要没 await,里面的 reject 就不会被 catch 捕获:
- 直接写
fetch('/api').catch(...)→ 错误进 catch - 写成
try { fetch('/api') } catch(e) { }→ 错误完全漏掉,控制台报 unhandledrejection - 必须写成
try { await fetch('/api') }才行,因为 await 把 Promise “解包”成同步语义
Promise 链式结构天然适配异步流
.then().catch() 是 Promise 实例的方法,错误会沿链自动冒泡,不需要额外包裹:
- 每个
.then()返回新 Promise,失败时跳过后续 then,直达最近的.catch() - 可以只在链末尾写一个
.catch(),统一处理前面所有步骤的 reject - 适合简单无依赖请求,比如
getUser().then(show).catch(handleError)
async/await + try-catch 更接近“同步写法”
这是目前主流推荐的组合,逻辑清晰、调试友好:
- await 让异步操作像同步一样顺序执行,错误可直接用 try-catch 捕获
- 多个有依赖的请求写起来不嵌套:
const a = await api1(); const b = await api2(a); - 注意:不加 try-catch 时,await 失败会导致整个函数中断,后续代码不执行
实际选型建议
不硬记规则,看具体需求:
- 单个简单请求、快速原型 → 直接用
.then().catch(),轻量无负担 - 多步串行、需条件分支或复用变量 → 用
async/await + try-catch - 并行请求(如初始化多个模块)→ 用
Promise.all([p1, p2]).catch(...)或 await + 数组解构 - 封装了请求工具类(统一返回 { data, error })→ 可彻底不用 try-catch 和 .catch,靠 if 判断即可











