JavaScript 错误处理艺术:从 try-catch 到全局监控的实战指南与异常捕获技巧

大家好,我是第八哥,做互联网开发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,
        urlwindow.location.href,
        timenew Date().toISOString()
    };
    // 简单的上报示例
    fetch('/api/report-error', {
        method'POST',
        bodyJSON.stringify(errorInfo),
        headers: { 'Content-Type''application/json' }
    });
}

现在也有很多成熟的工具,比如Sentry,它能自动收集错误并分析,省了不少事。

总结:错误处理的几个小原则

10年经验总结下来,就几条:能预见的错误一定要处理;异步错误别漏抓;全局监控不能少;错误信息要记全

毕竟,用户看不到的错误,才是最可怕的。做好错误处理,代码才能更稳当~

上一篇 JavaScript 异步编程深入浅出:从回调地狱到 async/await 的进化之路 | 10 年开发经验解析 下一篇 JavaScript 代码优化技巧:从实战出发,写出更简洁高效可维护的代码

评论

暂不支持评论