优雅回退需捕获json解析异常、提供语义化默认值、区分未初始化与数据损坏、清理脏数据并封装安全读写工具。

当 localStorage 中的数据格式损坏(比如 JSON 解析失败),直接报错或中断逻辑会影响用户体验。优雅回退的关键是:**捕获解析异常、提供默认值、避免静默失败、必要时清理脏数据**。
用 try-catch 包裹 JSON.parse
这是最基础也最关键的一步。localStorage.getItem() 返回的是字符串,但可能为空、被篡改、或非 JSON 格式(如旧版本存的原始字符串、undefined 被转成 `"undefined"`)。
- 永远不要假设 getItem() 的返回值可直接 JSON.parse
- 在解析前做空值检查,再包裹 try-catch
- 捕获 SyntaxError 后,不抛出错误,而是走降级逻辑
提供语义化默认值并区分“未初始化”和“解析失败”
不能一律用 {} 或 [] 代替——这会让业务逻辑难以判断是首次使用,还是数据已损坏。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 为不同用途的 key 设计专属默认值(如用户设置用
{ theme: 'light', lang: 'zh' },列表数据用[]) - 可额外写一个标记字段(如
__version: 1)辅助校验结构完整性 - 若解析失败,可记录一次日志(console.warn)或上报监控,但不影响主流程
自动清理无效数据,防止下次继续失败
保留损坏的字符串没有意义,反而会导致每次访问都重复报错。
- 在 catch 块中调用
localStorage.removeItem(key)清除坏数据 - 如果业务允许,也可 fallback 后重新 setItem 默认值(相当于“重置”该配置)
- 注意:不要在页面加载初期集中清理所有 key,应按需、逐 key 处理
封装成可复用的安全读写工具
把上述逻辑收敛成函数,避免各处重复写 try-catch。
const safeLocalStorage = {
get(key, defaultValue = null) {
const raw = localStorage.getItem(key);
if (raw == null) return defaultValue;
try {
return JSON.parse(raw);
} catch (e) {
console.warn(`[LS] Parse failed for key "${key}":`, e);
localStorage.removeItem(key);
return defaultValue;
}
},
set(key, value) {
try {
localStorage.setItem(key, JSON.stringify(value));
} catch (e) {
console.warn(`[LS] Set failed for key "${key}":`, e);
// 可选:触发降级存储(如 sessionStorage 或内存缓存)
}
}
};
使用时:const userPrefs = safeLocalStorage.get('user-settings', { theme: 'light' });
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










