大家好,我是第八哥,做互联网开发10年了,踩过的坑能绕“地球半圈”😀。今天想跟大家聊聊 JavaScript 错误处理这事儿 —— 这玩意儿看着简单,其实藏着不少门道。
为啥错误处理对JS开发这么重要?
刚入行时我总觉得,代码能跑起来就行。直到一次线上事故:用户付款后订单没生成,查了半天才发现是个没处理的JSON解析错误在作祟。
从那以后我才明白,错误处理不是可有可无的装饰,而是系统稳定的基石。尤其JS这门语言,灵活归灵活,但是其中的隐式错误能让你找bug找到怀疑人生。
try-catch:最基础也最容易用错的武器
说到错误处理,我们最先想到的肯定是try-catch。这就像给代码加了个安全气囊,把可能出问题的代码给包起来:
try {
const data = JSON.parse(userInput);
console.log('解析成功', data);
} catch (error) {
console.error('解析失败', error.message);
}
但是新手们常犯的一个错误是:把大段代码全塞进try里。其实我们应该只包裹那些“可能出错的部分”,不然会很难定位问题。
异步代码的错误处理:别让异常“跑路”
异步操作里的错误最容易让人头疼。比如早期的setTimeout,try-catch根本抓不住它的错误:
// 无效的捕获方式
try {
setTimeout(() => {
throw new Error('异步错误');
}, 1000);
} catch (error) {
console.log('抓不到我~', error); // 永远不会执行
}
Promise出现后好多了,用.catch()就能收尾:
fetch('/api/data')
.then(res => res.json())
.catch(error => {
console.error('请求出错', error);
});
现在更推荐async/await搭配try-catch,代码看着更清爽:
async function fetchData() {
try {
const res = await fetch('/api/data');
const data = await res.json();
return data;
} catch (error) {
console.error('请求失败', error);
return null;
}
}
全局异常监控:给整个应用加道“防火墙”
单个try-catch只能管一小块代码,只有全局监控才能覆盖整个应用。
window.onerror是最常用的
window.onerror = function (message, source, lineno, colno, error) {
console.error('全局捕获:', message, '行号:', lineno);
// 这里可以加错误上报逻辑
return true; // 阻止浏览器默认处理
};
但它管不了Promise的未捕获错误,这时候就得用unhandledrejection
了:
window.addEventListener('unhandledrejection', event => {
console.error('未处理的Promise错误:', event.reason);
event.preventDefault(); // 阻止默认警告
});
还有资源加载错误,比如图片、脚本加载失败,得用这个:
window.addEventListener('error', (event) => {
if (event.target instanceof HTMLImageElement) {
console.error('图片加载失败:', event.target.src);
}
}, true);
错误上报:让问题“有迹可循”
光捕获错误还不够,我们还得知道用户端具体出了啥问题,这时候就可以自己写个上报函数:
function reportError(error) {
const errorInfo = {
message: error.message,
stack: error.stack,
url: window.location.href,
time: new Date().toISOString()
};
// 简单的上报示例
fetch('/api/report-error', {
method: 'POST',
body: JSON.stringify(errorInfo),
headers: { 'Content-Type': 'application/json' }
});
}
现在也有很多成熟的工具,比如Sentry
,它能自动收集错误并分析,省了不少事。
总结:错误处理的几个小原则
10年经验总结下来,就几条:能预见的错误一定要处理;异步错误别漏抓;全局监控不能少;错误信息要记全。
毕竟,用户看不到的错误,才是最可怕的。做好错误处理,代码才能更稳当~
评论