首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么可完成的未来日志没有异常?

为什么可完成的未来日志没有异常?
EN

Stack Overflow用户
提问于 2021-11-04 12:38:43
回答 1查看 97关注 0票数 1

在spring boot应用程序中使用CompletableFuture时,我注意到在使用CompletableFuture异步运行的函数中发生了异常,但没有任何日志。函数执行停止,因此CompletableFuture已完成。为什么日志里什么都没有?当我在.runAsync中使用.whenComplete时,我能够记录错误。

代码语言:javascript
复制
void function() {
   CompletableFuture
     .runAsync(() -> runAsyncfunction())
     .whenComplete((result, err) -> {//log the error})
 }

编辑:如果我不使用.whenComplete,JVM不会自动打印在runAsyncfunction中发生的未捕获异常的堆栈跟踪。但是如果我使用.whenComplete,我可以记录异常。

另外,在这样的场景中使用.whenComplete是一种良好的行业实践吗?

EN

回答 1

Stack Overflow用户

发布于 2021-11-04 22:25:50

“JVM”不会随意打印异常堆栈跟踪。你需要编写代码来实现它。我能想到的唯一可能发生的情况是,如果异常从main()中转义出来。否则,您编写的代码或您调用的代码具有打印堆栈跟踪的显式指令。也许如果你的代码是从Spring Boot代码中调用的,Spring Boot代码会有一个异常处理程序来为你做这件事--我不知道,我不会用它。

在这种情况下

代码语言:javascript
复制
someFuture.runAsync(() -> runAsyncfunction());

在调用someFuture.runAsync()时,将返回一个新的CompletableFuture,您已经忽略了该new。

当someFuture完成时,您的runAsyncFunction()将执行,很可能是在其他线程中执行。如果抛出异常,“你忽略的未来”将异常完成。但你永远不会发现它,因为你忽略了原本会告诉你的机制。

总而言之:在运行异步例程的线程中抛出了一些异常。这个异常在那里被捕获,并被用来“异常地完成未来”。但是你需要做一些事情来发现未来已经完成;在你完成之前,它只是未来未被检查的状态信息。

此结构:

代码语言:javascript
复制
someFuture.runAsync(() -> runAsyncfunction())
          .whenComplete(blah blah);

等同于

代码语言:javascript
复制
CompletableFuture<Void> x =
    someFuture.runAsync(() -> runAsyncfunction());
x.whenComplete(blah blah);

也许这会让事情变得更加清晰。“runAsync”失败,“x”异常完成。然后触发whenComplete,您可以对失败做一些有用的事情。

脚注:张贴的代码在我看来是无效的。

代码语言:javascript
复制
CompletableFuture
   .runAsync(() -> runAsyncfunction())
   .whenComplete((result, err) -> {//log the error})

所以我希望我猜对了你的意图。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69839401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档