try-catch需将await置于try块内以捕获异步异常;应按业务语义分组包裹、区分错误类型并路由处理;finally用于确定性清理,递归与并发需各自独立保护。
try-catch 本身不“认识”异步,它只捕获当前同步执行上下文中的异常。要让它在异步场景中真正起作用,关键不是机械加块,而是让 await 表达式落在 try 块内,从而把异步流程“拉回”同步控制流中。语义化的核心,是让每个 try-catch 明确表达“这一段异步操作的意图和边界”。
不要把多个不相关的异步调用塞进一个 try 块。比如获取用户、加载列表、拉取配置,三者失败原因和恢复策略不同,合并在一处会导致错误归因模糊、处理逻辑耦合。
更合理的写法是为每类操作单独包裹,或用 .catch() 链式兜底,保持职责清晰。
catch 中不要只做 console.error 或统一弹窗。应通过 error 实例的属性(如 name、status、code)或自定义错误类(NetworkError、AuthError、ParseError)区分语义。
立即学习“Java免费学习笔记(深入)”;
finally 是“无论如何都要执行”的收尾环节,适合清除定时器、取消 pending 请求、释放锁等确定性操作。若需 await 清理动作(如关闭连接),必须确保函数为 async,且清楚知道:finally 内 await 的异常会覆盖原错误。
异步递归(如轮询、重试)中,每次递归调用都构成新的异步执行上下文。只在外层 try 里调用一次,后续递归就脱离保护。