最优雅的错误处理是 async/await + try/catch 构建清晰边界,搭配 Promise 工具、自定义错误和全局监听;需注意 await 才触发 catch,.json() 等后续操作也需防护,依业务选 Promise.all/allSettled,封装 safeAwait 等工具,并监听 unhandledrejection 作兜底。

最优雅的方式是用 async/await + try/catch 构建清晰的错误边界,同时按需搭配 Promise 工具方法、自定义错误类型和全局兜底,让错误既不逃逸,也不掩盖关键信息。
用 try/catch 精准包裹 await 表达式
async 函数中,只有被 await 的 Promise 被 reject,才会触发 catch;直接 return 一个被 reject 的 Promise 不会进入 catch 块,这是常见陷阱。
- ✅ 正确:用
const data = await fetch(...),失败自然进 catch - ❌ 错误:在 try 内写
return Promise.reject(...),catch 不会捕获 - ⚠️ 注意:.json() 等后续解析也可能抛错,要单独检查或包在同一个 try 中
区分并行任务的成败场景
多个异步操作一起执行时,错误处理策略取决于业务语义:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 全成功才继续 → 用
Promise.all(),任一失败即中断 - 允许部分失败 → 改用
Promise.allSettled(),结果含每个任务的 status 和 value/reason - 各自独立容错 → 给每个 Promise 链加 .catch(),或用
try/catch分别 await
封装可复用的安全调用模式
避免重复写 try/catch,可抽象为工具函数,比如:
立即学习“Java免费学习笔记(深入)”;
-
safeAwait(promise):返回[ok, error, result]三元组,类似 Rust 的 Result -
withErrorHandling(fn):高阶函数,统一记录、上报、降级(如返回默认值) - 对 fetch 封装
apiCall(url, options),内置状态码判断、超时、重试逻辑
补全最后一道防线:全局未捕获监听
即使层层防御,仍可能漏掉未 await 的 Promise 或事件回调中的异步错误:
- 浏览器端监听
unhandledrejection事件,仅用于日志上报,不要试图“恢复” - Node.js 端监听
process.on('unhandledRejection') - 注意:该事件无法阻止控制台报错,也不能替代主动处理

















