429 字
2 分钟
11 · 错误处理与调试
错误也是代码的一部分
早年我习惯”能跑就行”,结果线上一个未捕获异常整页白屏。错误处理的本质:在预期会失败的地方,给程序一条退路。
错误类型
Error:基类,自定义错误继承它。TypeError:类型不对(如null.foo)。ReferenceError:访问未声明变量。RangeError:数值越界(如递归爆栈)。SyntaxError:解析阶段就报错(不会被 try/catch 捕获)。
try/catch/finally
try { const data = JSON.parse(input); // 可能抛 SyntaxError} catch (e) { if (e instanceof SyntaxError) { console.error("格式错误", e.message); } else { throw e; // 不认识的往上抛 }} finally { cleanup(); // 无论成功失败都执行(关闭连接、释放资源)}
catch里别吞掉错误——至少打日志,或重新throw。静默失败最可怕。
异步错误捕获
// Promisefetch(url).then(r => r.json()).catch(err => handle(err));
// async/await:用 try/catch 包住async function load() { try { const r = await fetch(url); return await r.json(); } catch (e) { report(e); throw e; }}注意:window.onerror / unhandledrejection 可兜住全局未捕获错误,用于监控上报。
调试实战
- 断点:Sources 面板在可疑行点断点,看调用栈和变量。
- 条件断点:右键断点加条件,只在特定值时停。
- console 技巧:
console.table看数组、console.dir看对象结构。 - Network:看请求状态、响应、Timing 定位慢请求。
小结
- 错误分类型,自定义错误继承
Error。 catch别吞错,要么处理要么重抛;finally做清理。- 异步用
.catch/try-catch包await;全局兜底用onerror/unhandledrejection。 - 调试靠断点 + 调用栈 + Network,比
console.log高效。
练习
- 写
parseSafe(json, fallback),解析失败返回 fallback 并打印错误类型。 - 用
async/await+try/catch改写一段.then().catch()链式。 - 给页面加
window.addEventListener('unhandledrejection', ...)上报未捕获 Promise 错误。