是否应使用try catch验证值?代码优化及最佳实践咨询
代码优化方案与验证方式探讨
一、原代码问题分析
原代码功能正常,但存在冗余操作(重复调用localStorage.getItem)、逻辑不够紧凑的问题,且部分场景依赖异常捕获做值验证,不符合常规最佳实践。
二、代码优化方案
1. 优化readJson函数
原函数多次重复读取localStorage,且解析失败后再次读取的操作冗余。优化后减少IO调用,逻辑更清晰:
function readJson(key, fallback) { let value = localStorage.getItem(key); // 无值时直接存入fallback并赋值 if (value === null) { value = fallback; localStorage.setItem(key, value); } try { return JSON.parse(value); } catch { // 解析失败时,重置为fallback并直接解析返回(fallback应为合法JSON) localStorage.setItem(key, fallback); return JSON.parse(fallback); } }
优化点:
- 仅调用1次
localStorage.getItem,避免重复读取本地存储 - 解析失败时直接解析
fallback,无需再次从localStorage读取(fallback本身是合法JSON字符串,不会抛出异常) - 逻辑线性化,可读性更强
2. 优化颜色值校验逻辑
原代码两次读取localStorage,且依赖hex2Rgb抛出异常来验证格式,属于用异常做控制流的反模式。优化后改为主动校验,同时减少存储读取:
方案一:保留try/catch但优化逻辑
const hexValue = localStorage.getItem(hexColor); try { // 先判断值存在,再验证格式 if (hexValue) { hex2Rgb(hexValue); setColor(hexValue); } else { setColor("#000000"); } } catch { setColor("#000000"); }
方案二:替换为主动校验(更推荐)
提取颜色校验逻辑,用正则判断格式,彻底避免依赖异常:
// 定义hex颜色校验正则 const isValidHex = (color) => /^#([0-9A-F]{3}){1,2}$/i.test(color); const hexValue = localStorage.getItem(hexColor); setColor(hexValue && isValidHex(hexValue) ? hexValue : "#000000");
优化点:
- 仅调用1次
localStorage.getItem,缓存结果 - 主动校验替代异常捕获,逻辑更直观,符合代码可读性要求
三、关于try/catch做值验证的最佳实践判断
不推荐将try/catch作为常规值验证的手段,原因如下:
- 异常设计的初衷是处理意外错误,而非预期内的格式校验,用异常做控制流会混淆代码逻辑
- 异常捕获的性能开销高于主动校验,频繁使用会影响代码运行效率
但存在例外场景:当验证逻辑复杂度极高(比如JSON解析),手动编写校验规则成本过高、易出错时,用try/catch处理是合理的选择。比如readJson函数中的JSON解析,因为手动校验JSON格式的难度大,不如直接用try/catch捕获解析失败的情况。
内容的提问来源于stack exchange,提问作者user22431569
相关产品推荐
相关产品推荐

