try-catch 错误处理

说明 throw/try/catch/finally 的控制流、异步错误边界,以及何时把错误变成返回值或上报。

#type / howto #status / growing #tech / dev #resource / javascript

[!info] 关联笔记

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 边界一起设计才完整。

自测题

  1. finally 里 return 有何风险?
  2. 为什么 try/catch 包 fetch().then() 不够?
参考答案
  1. 可能覆盖 try/catch 的返回值,掩盖成败。
  2. then 异步,错误在后续微任务;需 await 或 catch。
创建于 2025/1/1 更新于 2026/7/15