Java 如何使用CompletableFuture和CompletionStage进行异常处理
我正在处理一些涉及按顺序执行多个阻塞I/O操作的代码。上下文是运行在Java8和Tomcat上的基于JVM的web应用程序。我有按顺序执行三个操作的代码。所有操作都具有阻塞性质,并且每个操作的输出可在后续操作中使用。每个操作都可以抛出异常,可以是选中的,也可以是未选中的。我已经用一些可以抛出的异常示例进行了说明:Java 如何使用CompletableFuture和CompletionStage进行异常处理,java,asynchronous,java-8,completable-future,Java,Asynchronous,Java 8,Completable Future,我正在处理一些涉及按顺序执行多个阻塞I/O操作的代码。上下文是运行在Java8和Tomcat上的基于JVM的web应用程序。我有按顺序执行三个操作的代码。所有操作都具有阻塞性质,并且每个操作的输出可在后续操作中使用。每个操作都可以抛出异常,可以是选中的,也可以是未选中的。我已经用一些可以抛出的异常示例进行了说明: String output1 = callToRestAPI(); // throws MalformedUrlException, ConcurrentModificationExc
String output1 = callToRestAPI(); // throws MalformedUrlException, ConcurrentModificationException
callToDatabase(output1); // throws SQLException, ConcurrentModificationException
boolean output2 = callToSendEmail(output1); // throws MessagingException
我将如何使用Java 8承诺的无双关语的CompletionStage和CompletableFuture来编写这篇文章?希望这能有所帮助
import java.util.concurrent.CompletableFuture;
public class HandleException {
public static void main(String[] args) {
CompletableFuture.completedFuture(null)
.thenApply(__ -> callToRestAPI())
.thenApply(
output1 -> {
callToDatabase(output1);
return output1;
})
.thenAccept(output1 -> callToSendEmail(output1))
.exceptionally(
t -> {
System.out.println("Exception occurred: " + t.getMessage());
return null;
});
}
}
当代码阻塞时,使用apply和accept。当我们想将某些内容返回到下一个thenXXX方法时,使用thenApply。然后Accept不会返回任何内容。
您还可以使用runAsync或SupplySync将callToRestAPI、callToDatabase设置为异步非阻塞代码,希望这对您有所帮助
import java.util.concurrent.CompletableFuture;
public class HandleException {
public static void main(String[] args) {
CompletableFuture.completedFuture(null)
.thenApply(__ -> callToRestAPI())
.thenApply(
output1 -> {
callToDatabase(output1);
return output1;
})
.thenAccept(output1 -> callToSendEmail(output1))
.exceptionally(
t -> {
System.out.println("Exception occurred: " + t.getMessage());
return null;
});
}
}
当代码阻塞时,使用apply和accept。当我们想将某些内容返回到下一个thenXXX方法时,使用thenApply。然后Accept不会返回任何内容。
您还可以使用runAsync或SupplySync将callToRestAPI、callToDatabase设置为异步非阻塞代码。如何处理当前“伪”代码中的异常?我创建了一个与每个操作对应的自定义异常,捕获该操作引发的任何标准Java异常。然后,一个try块封装了所有3个操作,并为每个自定义异常定义了catch。这样,我就知道哪个操作失败了。如何处理当前“伪”代码中的异常?我创建了一个与每个操作对应的自定义异常,捕获该操作引发的任何标准Java异常。然后,一个try块封装了所有3个操作,并为每个自定义异常定义了catch。这样,我就知道哪个操作失败了。谢谢你的例子。如果我使用SupplySync,那么我是否必须使用thenCompose,这样我就不会&39;你不必处理双重包装的完整未来吗?另外,如果在末尾有一个通用异常块,我如何知道哪个部分抛出了异常?我是否需要使用instanceOf检查异常?是的,如果我们使用thencomose,那么就不必处理嵌套的CompletionStage。通过堆栈跟踪,我们应该能够确定哪个部分抛出了异常。但是,如果我们想根据引发异常的部分显示自定义错误消息,那么我们可以使用instanceOf。如果我使用SupplySync,那么我是否必须使用thenCompose,这样我就不会&39;你不必处理双重包装的完整未来吗?另外,如果在末尾有一个通用异常块,我如何知道哪个部分抛出了异常?我是否需要使用instanceOf检查异常?是的,如果我们使用thencomose,那么就不必处理嵌套的CompletionStage。通过堆栈跟踪,我们应该能够确定哪个部分抛出了异常。但是,如果我们想根据引发异常的部分显示自定义错误消息,那么我们可以使用instanceOf。