应谨慎使用 try...catch,仅在 i/o、解析、第三方 api 等不确定性高处捕获真正可能失败的异常;优先用可选链、空值合并、预检查、类型系统等避免异常发生,减少运行时开销与优化抑制。

JavaScript 中异常捕获(try...catch)本身开销不大,但频繁、滥用或在热路径中包裹无必要逻辑,会带来隐性成本:V8 等引擎可能禁用某些 JIT 优化(如内联、逃逸分析),且 catch 块会阻止作用域提升和变量优化。真正要减少的不是语法本身,而是「不该用却用了」和「本可避免却硬抛」的情况。
只在真正可能失败且需处理的地方用 try...catch
很多场景下错误是可预判、可规避的,强行用 catch 反而掩盖问题、拖慢执行:
-
JSON 解析前先检查字符串有效性:不要对任意输入直接
JSON.parse(input)包一层try...catch;可先用正则粗筛(如/^[\s{[}\]]+$/.test(input))或用JSON.parse(input, () => {})的 reviver 配合短路逻辑提前退出 -
访问嵌套属性前做存在性判断:用可选链
obj?.user?.profile?.avatar替代try { return obj.user.profile.avatar } catch;后者不仅慢,还把正常控制流变成了异常流 -
DOM 查询失败不等于异常:`document.querySelector('.missing')` 返回
null是预期行为,不是错误,无需try;只有调用null.method()才该被预防(用空值合并或可选链)
避免在循环或高频函数中动态创建 try...catch
每次进入 try 块,引擎都要准备异常处理上下文。若在每帧动画、每次滚动或每条数据处理中都新建 try...catch,开销会累积:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 把
try...catch提到外层,一次包裹整个批量操作,而不是每条数据包一次 - 对已知稳定逻辑(如纯数学计算、字符串拼接)完全不加
try;只保留在 I/O、解析、第三方 API 调用等不确定性高的边界处 - 若必须在循环内处理个别失败项,改用返回错误对象模式:
const result = parseItem(item) || { error: 'invalid format' },比抛错再捕获轻量得多
慎用 finally 和嵌套 try...catch
finally 块无论是否出错都会执行,且强制引擎保留更多执行上下文;多层嵌套更会加剧作用域链查找与栈管理负担:
- 不用
finally做资源清理——现代 JS 有using声明(ES2024)和AbortController等更明确机制 - 避免
try → try → catch → catch结构;合并为单层,按错误类型用if (err instanceof TypeError)分支处理 - 日志记录类操作(如
console.error)尽量放在catch内,但别在里面做 DOM 操作、网络请求等重任务——它们会延长异常处理时间,阻塞主线程
用静态检查和类型系统提前拦截潜在错误
真正减少运行时异常,靠的是让错误在开发阶段暴露:
- 用 TypeScript 标记非空断言、定义明确接口,使
undefined访问在编译期报错,而非运行时报异常 - 用 ESLint 规则如
no-unsafe-member-access、no-throw-literal主动发现易错写法 - 对关键路径加单元测试,覆盖边界输入(空字符串、
null、NaN),验证逻辑健壮性,而不是依赖catch当兜底
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










