Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用CompletableFuture和CompletionStage进行异常处理_Java_Asynchronous_Java 8_Completable Future - Fatal编程技术网

Java 如何使用CompletableFuture和CompletionStage进行异常处理

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

我正在处理一些涉及按顺序执行多个阻塞I/O操作的代码。上下文是运行在Java8和Tomcat上的基于JVM的web应用程序。我有按顺序执行三个操作的代码。所有操作都具有阻塞性质,并且每个操作的输出可在后续操作中使用。每个操作都可以抛出异常,可以是选中的,也可以是未选中的。我已经用一些可以抛出的异常示例进行了说明:

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。