HTML5中不存在StorageQuotaExceededError异常,实际抛出的是name为"QuotaExceededError"的DOMException;应通过try-catch捕获并检查err.name或err.code,而非实例化该不存在的构造函数。

HTML5 中并没有标准的 StorageQuotaExceededError 异常类型,它**不是规范定义的全局错误对象**,也不会在 localStorage 或 sessionStorage 操作中被原生抛出。所谓“存储空间溢出”异常,实际表现因浏览器而异,且需手动检测与处理。
为什么不会自动抛出 StorageQuotaExceededError
根据 HTML 和 Web Storage 规范,localStorage.setItem() 在超出配额时的行为是:静默失败(不抛异常),而是直接抛出 DOMException,其 name 属性可能为 "QuotaExceededError"(注意大小写和拼写,不是 StorageQuotaExceededError)。这个名称是 DOMException 的标准 code name 之一,但并非独立构造函数。
如何正确捕获配额超限错误
应使用 try-catch 捕获 DOMException,并检查其 name 或 code 属性:
-
✅ 正确方式:检查
err.name === "QuotaExceededError"或err.code === 22(DOMException.QUOTA_EXCEEDED_ERR) -
❌ 错误方式:试图
new StorageQuotaExceededError()或catch (e instanceof StorageQuotaExceededError)—— 浏览器不支持该构造函数
实用的容错写法示例
以下是一个健壮的 setItem 封装,自动清理旧数据并降级处理:
立即学习“前端免费学习笔记(深入)”;
function safeSetItem(key, value) {
try {
localStorage.setItem(key, value);
} catch (err) {
if (err.name === "QuotaExceededError" || err.code === 22) {
console.warn("本地存储已满,尝试清理缓存...");
// 可选:清除部分非关键项,或提示用户
clearNonEssentialItems();
// 再试一次(或存到 sessionStorage / IndexedDB)
try {
localStorage.setItem(key, value);
} catch (e) {
console.error("仍无法写入 localStorage,考虑降级方案");
fallbackToIndexedDB(key, value); // 如使用 IndexedDB 替代
}
} else {
throw err; // 其他错误继续上抛
}
}
}
更可靠的长期方案:优先使用 IndexedDB
localStorage 天然受限(通常 5–10MB,且无统一配额查询接口),而 IndexedDB:
- 提供更大的默认配额(可达硬盘空间的 50%,受浏览器策略影响)
- 支持
navigator.storage.estimate()查询当前使用量与配额(需 HTTPS) - 可监听
storage事件响应跨标签变更 - 错误类型明确(如
AbortError、UnknownError),便于分类处理



















