何时应该使用try catch而非then catch处理JavaScript异步操作?
什么场景下使用try/catch
try/catch 用于捕获代码执行过程中抛出的可预期异常,避免异常直接扩散到全局导致程序崩溃,适用场景主要包括:
- 处理本身存在失败概率的逻辑:比如网络请求、文件读写、JSON 序列化/反序列化、不确定输入的类型转换等,你示例中的接口请求就属于典型的适用场景。
- 后续逻辑依赖当前代码块执行成功:你的示例中只有接口请求成功返回有效数据后,才需要给用户列表、分页变量赋值,失败时不需要执行这部分逻辑,用 try 块隔离成功逻辑边界非常清晰。
- 需要统一执行收尾逻辑:你示例中用到的
finally非常合适,无论请求成功还是失败,都会执行关闭 loading 的操作,避免重复写冗余的收尾代码。 - 需要单独定制错误处理逻辑:如果当前操作的错误不能走全局通用的错误处理规则,需要单独提示或做特殊处理时,适合在当前作用域用 try/catch 单独捕获。
注意不要滥用 try/catch:不要用它包裹所有业务代码,完全可控的基础逻辑、语法错误这类本就应该在开发阶段暴露的问题,用 try/catch 反而会隐藏本应该修复的 bug。
同类场景下使用 then(...).catch(...) 是否属于良好实践
两种写法都是规范内的合法写法,没有绝对的优劣,是否属于良好实践取决于你的项目规范和实际场景:
- 如果你的项目整体已经统一使用 async/await 风格编写异步代码,那 try/catch 的写法可读性更高,异步流程和同步代码的书写逻辑一致,更容易理解。
- 如果是多个异步操作连续调用的链式场景,then 链式写法会更简洁:
findUsers() { this.loading = true; this.api.get('/users/list') .then(([users, count]) => { this.users = users; this.totalPages = Math.ceil(parseInt(count) / 10); }) .catch(error => this.Messages.requestFailed(error)) .finally(() => this.loading = false); }
- 你当前的单请求场景下,两种写法的错误捕获范围、执行逻辑完全等价,用哪种都属于良好实践,核心原则是同一个项目内写法统一,不要混合使用两种异步错误处理风格,增加其他开发者的理解成本。
- 额外注意:如果使用 then.catch 写法,不要漏写 catch 块,未被捕获的 Promise 异常会直接抛到全局,可能导致页面报错。
内容的提问来源于stack exchange,提问作者Tchiteu Abloh
相关产品推荐
相关产品推荐

