0

0

如何使用Java的CompletableFuture处理异常回调_exceptionally用法

P粉602998670

P粉602998670

发布时间:2026-03-04 12:35:02

|

835人浏览过

|

来源于php中文网

原创

exceptionally仅捕获前一异步阶段抛出的异常,不具全局兜底能力;它只在上游明确失败时执行,接收throwable并返回同类型值,无法获取正常结果,与handle相比更专一但灵活性低。

如何使用java的completablefuture处理异常回调_exceptionally用法

exceptionally 回调只捕获上一个异步阶段的异常

exceptionally 不是全局异常兜底,它只响应紧挨着它的前一个 CompletableFuture 阶段抛出的异常。如果前面用了 thenApply 且没抛异常,那后面的 exceptionally 根本不会触发。

  • 常见错误现象:exceptionally 完全没执行,但程序却报了 CompletionException —— 很可能是因为异常发生在更早的链路里,或者被中间某个阶段吞掉了
  • 正确使用场景:专用于处理前一步计算(比如 supplyAsyncthenCompose)明确抛出的异常,不是用来替代 try-catch 的
  • 参数差异:exceptionally 接收一个 Function<throwable t></throwable>,返回值类型必须和上游阶段一致;不能改变返回类型,否则编译不通过

exceptionally 和 handle 的关键区别在哪

handle 是更通用的回调,无论上游成功还是失败都会执行;而 exceptionally 只在失败时运行,且不暴露正常结果值。

  • 性能影响:两者开销接近,但 handle 多一次函数调用判断,实际差异可忽略
  • 兼容性:都从 Java 8 开始支持,无版本风险
  • 容易踩的坑:误以为 exceptionally 能拿到原始输入参数——它只能访问异常对象,不像 handle 同时接收 (result, throwable)
  • 示例对比:
CompletableFuture.supplyAsync(() -> { throw new RuntimeException("boom"); })
  .exceptionally(t -> "fallback"); // ✅ 返回 String,类型匹配

CompletableFuture.supplyAsync(() -> "ok")
  .exceptionally(t -> "fallback"); // ❌ 永远不执行,上游没异常

exceptionally 无法捕获运行时未声明的异常?

可以。Java 的异常机制对 CompletableFuture 没有特殊限制,exceptionally 能捕获所有 Throwable 子类,包括 RuntimeExceptionError(如 OutOfMemoryError),只要它没被上游提前处理掉。

Lexica
Lexica

一个搜索 AI 生成图片的网站,可以上传图片或prompts搜索图片。

下载
  • 但注意:Error 类异常通常不应靠 exceptionally 恢复,而是该让进程退出或监控告警
  • 常见错误现象:写了 exceptionally 却仍看到线程中断或应用崩溃——大概率是 Error 被传播到了 ForkJoinPool 的默认线程,未被任何 handler 拦截
  • 建议做法:对关键链路,优先用 handle + 显式判空/判异常,比依赖 exceptionally 更可控

多个 exceptionally 连续写会有叠加效果吗

不会。每个 exceptionally 只作用于它直接修饰的那个阶段,后续再接的 exceptionally 是针对新阶段的,跟前面的无关。

立即学习Java免费学习笔记(深入)”;

  • 典型误解:以为写两次 exceptionally 就能“双重兜底”,其实第二个根本不会触发,除非第一个自己又抛了异常
  • 示例:
supplyAsync(() -> { throw new RuntimeException("first"); })
  .exceptionally(t -> { throw new RuntimeException("second"); }) // 这里抛出新异常
  .exceptionally(t -> "final"); // ✅ 这个会捕获 "second"

真正容易被忽略的是:异常一旦被 exceptionally 拦截并返回正常值,整个链就转为“成功态”,后续所有 thenXXX 都按 success 走,不会再进别的 exceptionally

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

431

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

373

2023.10.25

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

723

2023.08.10

function是什么
function是什么

function是函数的意思,是一段具有特定功能的可重复使用的代码块,是程序的基本组成单元之一,可以接受输入参数,执行特定的操作,并返回结果。本专题为大家提供function是什么的相关的文章、下载、课程内容,供大家免费下载体验。

495

2023.08.04

js函数function用法
js函数function用法

js函数function用法有:1、声明函数;2、调用函数;3、函数参数;4、函数返回值;5、匿名函数;6、函数作为参数;7、函数作用域;8、递归函数。本专题提供js函数function用法的相关文章内容,大家可以免费阅读。

166

2023.10.07

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

5

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

11

2026.03.04

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

33

2026.03.03

C++高性能网络编程与Reactor模型实践
C++高性能网络编程与Reactor模型实践

本专题围绕 C++ 在高性能网络服务开发中的应用展开,深入讲解 Socket 编程、多路复用机制、Reactor 模型设计原理以及线程池协作策略。内容涵盖 epoll 实现机制、内存管理优化、连接管理策略与高并发场景下的性能调优方法。通过构建高并发网络服务器实战案例,帮助开发者掌握 C++ 在底层系统与网络通信领域的核心技术。

25

2026.03.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.1万人学习

C# 教程
C# 教程

共94课时 | 10.6万人学习

Java 教程
Java 教程

共578课时 | 76.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号