最佳实践:getSessionStorage操作是否需要用try catch包裹?
SessionStorage 异常场景问题解答
异常场景是否会导致应用崩溃
你提到的老旧浏览器不支持、浏览器/扩展程序禁止存储操作等极端场景确实会导致应用崩溃。
当浏览器不支持sessionStorage特性、或存储权限被禁用时,直接访问window.sessionStorage对象,或是调用getItem、setItem等存储API都会直接抛出未捕获的JS异常,导致当前执行上下文的代码中断运行,如果相关逻辑是在页面初始化阶段执行,甚至会引发页面白屏、全量功能不可用的问题。
try catch 包裹操作是否为最佳实践
将sessionStorage操作包裹在try catch中实现优雅降级是业内公认的最佳实践,但需要注意不能只覆盖读取操作,要配套全链路的异常捕获和降级逻辑,具体落地可以遵循以下规范:
- 不要在业务代码中零散操作sessionStorage,统一封装成专用的存储工具库,所有读写操作都收敛到工具层处理
- 不仅
getItem操作要捕获异常,setItem、removeItem、clear等写入/删除操作同样可能因为权限不足、存储空间已满等问题抛出异常,都需要做异常捕获 - 内置兜底降级方案:捕获到异常时自动降级到内存变量存储,需要注意内存存储的数据会在页面刷新后丢失,必要的业务场景可以补充权限引导提示,告知用户开启存储权限以获得完整功能体验
- 可以提前做可用性检测,初始化阶段先判断sessionStorage是否可用,后续操作直接基于检测结果走对应逻辑,减少重复的异常捕获开销
以下是简单的封装示例:
// 内存兜底存储 const memoryFallback = {} // 预检测sessionStorage可用性 let isSessionStorageAvailable = false try { const testKey = '__support_test__' window.sessionStorage.setItem(testKey, testKey) window.sessionStorage.removeItem(testKey) isSessionStorageAvailable = true } catch (e) {} // 读取方法封装 export function getSessionStorage(key, defaultValue = null) { if (isSessionStorageAvailable) { try { const rawValue = window.sessionStorage.getItem(key) return rawValue ? JSON.parse(rawValue) : defaultValue } catch (e) {} } return memoryFallback[key] ?? defaultValue } // 写入方法封装 export function setSessionStorage(key, value) { if (isSessionStorageAvailable) { try { window.sessionStorage.setItem(key, JSON.stringify(value)) return true } catch (e) {} } memoryFallback[key] = value return true }
内容的提问来源于stack exchange,提问作者Joe Lloyd
相关产品推荐
相关产品推荐

