写代码时总崩?这几种错误处理方式,程序员天天在用

你有没有遇到过:点一下按钮,程序直接黑屏;提交表单后页面卡死;或者调试半天,控制台只甩出一行红字 TypeError: Cannot read property 'name' of undefined —— 然后就懵了?别急,这不是你水平差,是错误处理没跟上。

错误不是bug,是必经流程

代码就像做饭,切菜可能切到手,油锅可能溅出来。程序运行环境复杂,网络延迟、用户乱输、磁盘满了、接口挂了……这些都可能触发错误。关键不是“不出错”,而是“出错后不翻车”。

最常见的三类错误,怎么接住?

1. 语法错误(SyntaxError)
写漏括号、少个分号、拼错关键字——这类错误通常在代码加载或解析阶段就被拦下,浏览器或编辑器会直接报错,改完就能跑。不用额外处理,靠编辑器实时提示+保存时检查就够。

2. 运行时错误(Runtime Error)
比如访问一个还没加载完成的对象属性:

const user = getUserFromAPI(); // 返回 null
console.log(user.name); // TypeError: Cannot read property 'name' of null
解决办法很简单:加一层保护。
if (user && user.name) {
console.log(user.name);
} else {
console.log('用户信息暂不可用');
}
或者用可选链操作符(现代JS):
console.log(user?.name ?? '未知用户');

3. 异步错误(比如 fetch 失败)
网络请求最不讲道理。用户断网、服务器502、CORS被拦……这些都不会抛出传统异常,但 promise 会进入 catch 分支。

fetch('/api/profile')
.then(res => {
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return res.json();
})
.then(data => renderProfile(data))
.catch(err => {
showNotification('加载失败,请检查网络', 'error');
console.error('获取资料出错:', err);
});
注意:别只写 .catch() 却不处理,更别让它空着。

别让错误悄悄消失

有些同学喜欢这么写:

try {
doSomethingRisky();
} catch (e) {
// 啥也不干
}
看着“稳”了,其实埋了雷——下次出问题连线索都没。哪怕只是 console.error(e),也比静默强十倍。

真实项目里,建议把未捕获错误上报到日志服务:

window.addEventListener('error', (e) => {
reportToLogService({
message: e.message,
filename: e.filename,
lineno: e.lineno,
});

给用户留条活路

错误提示别写“System error #E4092”,用户看不懂。换成:“头像上传失败,可能是图片太大或网络不稳定,试试换个文件?”
再加个“重试”按钮,体验立马不一样。

错误处理不是炫技,是让程序有呼吸感——它会出错,但不会死给你看。