try-catch 错误处理
说明 throw/try/catch/finally 的控制流、异步错误边界,以及何时把错误变成返回值或上报。
#type / howto
#status / growing
#tech / dev
#resource / javascript
[!info] 关联笔记
- 所属:语言基础 / 阶段三
- 相关:Promise · async/await · null/undefined
try-catch 错误处理
这个概念为什么出现
库存接口失败、JSON 解析失败、权限不足——若让异常裸奔,UI 白屏;若全部吞掉,故障不可见。try/catch 是同步(及 await)路径上的结构化错误边界。
[!abstract] 一句话理解
throw中断正常路径;try/catch捕获可恢复错误;finally无论成败都做清理。
最小可运行示例
场景:解析导入的 SKU JSON 文件
function parseSkuJson(text) {
try {
const data = JSON.parse(text)
if (!data || typeof data.sku !== 'string') {
throw new Error('SKU 字段缺失')
}
return { ok: true, data }
} catch (err) {
return { ok: false, error: err instanceof Error ? err.message : String(err) }
} finally {
// 教学点:释放临时状态/打点;不要在 finally 里 return 掩盖结果
console.log('parseSkuJson finished')
}
}
console.log(parseSkuJson('{"sku":"A-01"}'))
console.log(parseSkuJson('{'))
异步边界
async function load() {
try {
await fetch('/api/x')
} catch (e) {
// 捕获 await 的 rejection
}
}
// 裸 promise 需 .catch;try/catch 包不住未 await 的 rejection
工程实践
- 区分可恢复与不可恢复
- 错误信息带上下文(SKU id、请求号)
- 不要空 catch
- UI 层转用户可读,日志层保留技术细节
本节总结
try/catch 是控制流工具,不是日志框架;与 Promise/async 边界一起设计才完整。
自测题
- finally 里 return 有何风险?
- 为什么 try/catch 包
fetch().then()不够?
参考答案
- 可能覆盖 try/catch 的返回值,掩盖成败。
- then 异步,错误在后续微任务;需 await 或 catch。