You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

是否应使用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作为常规值验证的手段,原因如下:

  1. 异常设计的初衷是处理意外错误,而非预期内的格式校验,用异常做控制流会混淆代码逻辑
  2. 异常捕获的性能开销高于主动校验,频繁使用会影响代码运行效率

但存在例外场景:当验证逻辑复杂度极高(比如JSON解析),手动编写校验规则成本过高、易出错时,用try/catch处理是合理的选择。比如readJson函数中的JSON解析,因为手动校验JSON格式的难度大,不如直接用try/catch捕获解析失败的情况。

内容的提问来源于stack exchange,提问作者user22431569

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 18:43:10