开篇
前端开发中,错误处理很常见:接口失败、JSON 解析报错、业务失败和系统异常混在一起处理。不少人要么到处 try/catch,要么该用的地方没用,导致线上问题难排查、用户提示不友好。
用原生 try/catch 配合 Promise/async 的错误处理就能覆盖大部分场景。本文结合真实项目中的常见需求,说明什么时候用 try/catch、什么时候用 .catch()、业务异常和系统异常如何区分,只讲日常开发里 80% 会用到的情况。
一、先搞清楚:try/catch 到底能抓到啥
很多人的第一反应是:try/catch 能把'所有报错'都包住。实际上不是。
1.1 能抓到的:同步代码里的异常
try {
const obj = JSON.parse('{ invalid json }'); // 抛出 SyntaxError
console.log(obj);
} catch (e) {
console.error('解析失败:', e.message); // 能抓到
}
只要错误是在同步代码里抛出的,就会被 catch 捕获。
1.2 抓不到的:异步里的错误
try {
setTimeout(() => {
throw new Error('异步报错'); // 这个 catch 抓不到!
}, 0);
} catch (e) {
console.error(e); // 不会执行
}
setTimeout 的回调在下一个事件循环执行,执行时 try 早就结束了,所以这里的 catch 完全接不到这个错误。
同理,Promise 内部的 reject、Ajax 的失败回调等异步错误,也不能被外层的 try/catch 直接捕获,需要用别的方式处理。
二、Ajax 错误:别只盯着 try/catch
2.1 fetch 简介
在讲 Ajax 错误之前,先简单说一下 fetch 是什么,这样后面的代码你才能看得懂。
**一句话:**fetch 是浏览器自带的、用来向服务器发请求、拿数据的 API。
可以把它理解成:
- 你:在浏览器里打开页面,想拿到用户列表、商品信息等
- 服务器:数据放在后端,需要通过「请求」才能给你
- fetch:就是你发请求、等回复的「工具」


