QuotaExceededError 是浏览器在 localStorage.setItem() 时因存储空间耗尽抛出的运行时异常,必须每次写入都 try-catch 捕获,并依据错误类型分场景降级处理,而非清理全部数据。

遇到 QuotaExceededError 不代表代码写错了,而是浏览器明确告诉你:本地存储空间已用尽。它不是可预判的“状态”,而是一个必须在写入瞬间捕获的运行时异常——没有提前查询剩余容量的 API,也没有跨浏览器统一的配额数值。
必须对每次 setItem 做 try-catch 防护
这是唯一可靠的方式。浏览器只在 localStorage.setItem() 执行失败时抛出该错误,且行为不可逆:
- 不加 catch 会导致 Uncaught 错误,可能中断后续逻辑甚至白屏
- 不能只在初始化或关键节点检查一次,必须包裹每一次写入操作
- 测试用的小数据(如
"test")比大对象更适合作为试探写入项,避免误判
准确识别 QuotaExceededError 的兼容写法
不同浏览器返回的错误细节不一致:Chrome/Firefox 多为 err.name === "QuotaExceededError",旧版 Safari 可能是 err.name === "NS_ERROR_DOM_QUOTA_REACHED" 或 err.code === 1014,Firefox 也可能用 err.code === 22。推荐封装判定函数:
return err instanceof DOMException && (
err.name === 'QuotaExceededError' ||
err.name === 'NS_ERROR_DOM_QUOTA_REACHED' ||
err.code === 22 ||
err.code === 1014
);
}
熔断后要分场景响应,不能一刀切清理
捕获到错误只是开始,后续动作决定用户体验是否断裂:
- 非关键数据(如页面滚动位置、表单草稿):可静默丢弃,并提示用户“本地缓存已满,当前操作未持久化”
- 核心数据(如登录态 token、主题偏好):应立即降级,优先尝试
sessionStorage(同源同窗口独立 5MB),再 fallback 到内存缓存 + 下次启动重拉 - 严禁调用
localStorage.clear()—— 它会无差别删除所有键,极易误删关键字段 - 安全清理建议按前缀(如
draft_、cache_)、时间戳(如 7 天前)或解析失败的脏数据来筛选删除项
长期更可靠的方案是源头减负 + 技术升级
反复清理是补救,不是根治:
- 只存必要字段:用户信息留
id、name、expiresAt即可,别存完整接口响应 - 禁存大体积内容:base64 图片、HTML 片段、二进制 blob 应改用 URL 引用
- 长文本压缩:用
lz-string压缩日志或草稿,纯文本压缩率常达 60%+ - 超大结构数据(如离线消息、文件列表)直接使用
IndexedDB,配合localForage封装更省心

















