QuotaExceededError 表示浏览器本地存储已满,需每次调用 localStorage.setItem() 时用 try...catch 捕获;捕获后应按时间优先清理过期缓存、保留关键数据,并递归重试,最终降级至 sessionStorage 或压缩数据。

遇到 QuotaExceededError 不代表代码写错了,而是浏览器明确告诉你:本地存储空间已用尽。它无法提前预知,也没有统一配额数值,唯一可靠的做法是——每次调用 localStorage.setItem() 都必须用 try...catch 捕获。
必须对每次 setItem 做 try-catch 防护
浏览器只在写入失败时抛出该错误,且行为不可逆。不加捕获会导致未捕获异常,可能中断后续逻辑甚至白屏。
- 不能只在初始化或关键节点检查一次,必须包裹每一次写入操作
- 不要依赖
localStorage.length或序列化后计算长度,这些无法反映真实字节数,还可能自身触发异常 - 写入内容建议用小测试字符串(如
"test")试探,避免因单次写入过大误判容量
捕获到 QuotaExceededError 后怎么降级处理
不是直接清空所有数据,而是按业务规则智能清理旧缓存,再重试写入。
- 优先删除过期项(比如带
stamp时间戳的缓存,按升序删最老的) - 保留关键字段(如用户 token、主题偏好),避免误删影响核心体验
- 可递归重试:清理一项后,再次调用
setItem,直到成功或无可删项 - 若清理后仍失败,说明当前缓存总量已逼近上限,需考虑降级方案(如改存 sessionStorage、压缩数据、或提示用户手动清理)
避免踩坑的关键细节
很多问题其实源于基础误用,而非容量本身。
立即学习“Java免费学习笔记(深入)”;
- 只存字符串:传对象必须
JSON.stringify(),取值后要JSON.parse() - 注意前缀隔离:多个业务共用 localStorage 时,用统一前缀(如
"myapp_")避免键名冲突和误删 - 隐私模式下 Safari 可能完全禁用 localStorage(iOS 11 以下),需有 fallback 逻辑
- 5MB 是常见上限,但实际可用空间受浏览器版本、是否启用无痕模式、甚至扩展插件影响,不能硬编码假设
推荐封装一个安全写入函数
把异常捕获 + 清理 + 重试逻辑收口,避免各处重复写 try-catch。
- 函数签名建议为
safeSetItem(key, value),内部自动处理 QuotaExceededError - 清理策略可配置,比如按时间、按使用频次、或按业务类型分级保留
- 加上日志(如
console.warn)便于线上监控存储压力趋势 - 必要时可结合预估大小(如
new TextEncoder().encode(JSON.stringify(val)).length)做前置判断,但不能替代 try-catch


















