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


