localstorage 超限时 setitem 会抛出 domexception(name 为 "quotaexceedederror" 或 "ns_error_dom_quota_reached"),需 try/catch 主动捕获;读取和清空不触发该异常,估算大小不可靠,建议统一检查 err.name 是否含 'quota' 并降级处理。

LocalStorage 存储超出上限时,JavaScript 不会抛出标准异常(如 RangeError 或 QuotaExceededError),但现代浏览器在调用 localStorage.setItem() 失败时,**会抛出 DOMException,且其 name 属性为 "QuotaExceededError"**(部分旧版 Safari 可能返回 "NS_ERROR_DOM_QUOTA_REACHED")。关键在于:这个异常**只在写入失败时触发,且必须主动 try/catch 捕获,不会静默失败。**
如何可靠捕获存储超限异常
直接对 setItem 做 try/catch 是最直接有效的方式:
- 包裹每次
setItem调用,检查是否因配额不足被拒绝 - 注意:读取(
getItem)或清空(clear)操作不会触发该异常 - 不要依赖
localStorage.length或估算大小来预判——浏览器实际限制受编码、内部开销等影响,不可靠
兼容性处理:主流浏览器的异常名称差异
不同浏览器抛出的 DOMException.name 略有不同,建议同时检查多个可能值:
- Chrome / Firefox / Edge:通常为
"QuotaExceededError" - Safari(尤其旧版本):可能为
"NS_ERROR_DOM_QUOTA_REACHED"或"QuotaExceededError" - 可统一用
err.name.includes('Quota') || err.name.includes('QUOTA')粗略匹配,更稳妥则显式列出
实用示例:安全写入 + 降级提示
以下代码演示了捕获异常并提供用户友好反馈:
function safeSetItem(key, value) {
try {
localStorage.setItem(key, value);
return true;
} catch (err) {
if (err.name === 'QuotaExceededError' ||
err.name === 'NS_ERROR_DOM_QUOTA_REACHED') {
console.warn('LocalStorage 已满,无法保存数据');
alert('本地存储空间已满,请清理浏览器缓存或尝试其他保存方式');
return false;
}
throw err; // 其他异常继续上抛
}
}
// 使用
safeSetItem('userPrefs', JSON.stringify({ theme: 'dark', lang: 'zh' }));
补充建议:避免频繁触发异常
仅靠捕获异常是被动防御,还可主动优化:
- 写入前用
JSON.stringify(value).length粗略估算字符串字节数(注意 UTF-16 编码下中文占 2 字节) - 定期清理过期/无用 key(如加时间戳前缀,配合 TTL 逻辑)
- 对大量数据考虑改用
IndexedDB,它容量更大且支持事务与查询
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











