前端错误处理:try/catch 与 Promise 的正确姿势
前端项目里,一遇到错误就到处塞 try/catch 的情况挺多见的。但另一方面,真正该处理的地方又给忘了——比如 fetch 的异常判断、JSON 解析的安全兜底。结果线上出了问题不好排查,错误提示要么太技术,要么压根没有。
要把错误处理好,关键就是两件事:知道 try/catch 能管什么、不能管什么,然后把'业务上能预料到的失败'和'真正的系统异常'分开处理。下面结合一些常见场景聊一下。
1. try/catch 到底能抓到什么
很多人的直觉是:try 块里的代码只要报错,catch 就能接住。其实只对了一半。
同步代码没问题
try {
const obj = JSON.parse('{ invalid json }'); // 抛出 SyntaxError
console.log(obj);
} catch (e) {
console.error('解析失败:', e.message); // 能抓到
}
因为 JSON.parse 的异常是同步抛出的,执行还没跳出 try,所以能被 catch 捕获。
异步里的错误,try/catch 就管不着了
try {
setTimeout(() => {
throw new Error('异步报错'); // 这个 catch 抓不到!
}, 0);
} catch (e) {
console.error(e); // 不会执行
}
setTimeout 的回调在下一个事件循环才执行,那时候 try 早就走完了,错误会直接冒泡成未捕获异常。类似的,Promise 内部的 reject、Ajax 回调里的错误也这么任性,得用别的办法对付。
2. fetch 的错误处理比你想的麻烦
fetch 是什么?
简单说,fetch 是浏览器自带的 API,用来向后端发请求、拿数据。它返回一个 Promise,所以用 async/await 配合起来很顺手。
常用姿势:
const res = await fetch('/api/user/list');
data = res.();
.(data);


