流程控制语句不捕获异常但可与try-catch协同:在if中主动throw error(勿用字符串),try包裹易错同步操作并命名catch参数,finally做清理不用于恢复,异步错误须用await+try或.catch(),全局兜底仅作日志。

流程控制语句(如 if、for、switch)本身不捕获异常,但可以和 try-catch 协同工作,在关键判断点主动抛出错误,并由外层统一捕获处理,让逻辑更清晰、错误更可控。
在条件分支中提前 throw 错误
当业务规则不满足时,不要等到后续执行才出错,而应在 if 判断里主动 throw,把问题显式暴露出来。这样既避免无效计算,又便于定位问题源头。
- 比如用户输入必须是正整数,可在 if 中检查并 throw new Error('请输入有效正整数')
- throw 的错误建议用 Error 构造函数创建,保留堆栈信息,方便调试
- 避免 throw 字符串(如 throw 'xxx'),它不带堆栈,不利于排查
用 try-catch 包裹可能出错的同步操作
对 JSON.parse、parseInt、访问深层属性等易失败的操作,单独放在 try 块中,catch 块做降级或提示。
- 例如:try { return JSON.parse(str); } catch (e) { return null; }
- catch 参数推荐命名(如 error),即使现代浏览器支持无参写法,也保持兼容性
- 不要在 catch 里静默吞掉错误(比如只写 catch {}),至少要 console.error 或上报日志
finally 用于清理与收尾
无论是否出错,都需要执行的逻辑(如关闭 loading、释放资源、重置状态)应放在 finally 块中。
- 比如发起请求前 showLoading(),finally 里 hideLoading()
- finally 不适合做业务恢复(如重试),它只保证执行,不区分成功失败
- 注意:finally 在 try 或 catch 中 return 后仍会执行,但不能改变返回值
异步场景下别依赖 try-catch 直接包裹 Promise
Promise.reject() 不会被外层 try-catch 捕获,必须用 .catch() 或 await + try 组合。
- 错误写法:try { Promise.reject(new Error('fail')); } catch(e) { /* 不会进这里 */ }
- 正确做法:async 函数中用 try { await fetch(...) } catch(e) { ... }
- 全局兜底可用 window.addEventListener('unhandledrejection'),仅用于日志,不替代主动处理
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











