java.util.concurrent.CompletionStage - 如何处理异常?

时间:2016-06-06 08:57:19

标签: java java-8 java.util.concurrent

我正在尝试找到更好的方法来处理以下代码中的多个异常:

public CompletionStage<Result> getRepositoryInfo(String repositoryOwner, String repositoryName) {
return repositoryInfoService.getRepositoryInfo(repositoryOwner, repositoryName)
        .handle((repositoryInfo, ex) -> {
            if (repositoryInfo != null) {
                return ok(Json.toJson(repositoryInfo));
            } else {
                if (ex.getCause() instanceof GithubRepoNotFoundException) {
                    return notFound(Json.toJson("repo not found"));
                } else {
                    return internalServerError(Json.toJson("internal error"));
                }
            }
        });
}

此程序获取github repo名称和所有者并返回一些基本信息(如全名,描述,克隆URL等)。 repositoryInfoService.getRepositoryInfo()会返回对象或引发GithubRepoNotFoundExceptionGithubApiException。这个instanceof看起来很丑陋,我对此并不满意。另一种选择是rethrow ex.getCause()但它也很糟糕。

1 个答案:

答案 0 :(得分:0)

有些库可以为if语句提供更流畅的API,特别是instanceof

使用javaslang matcher和java&#39; s Optional您的处理程序看起来像

.handle((repositoryInfo, ex) -> ofNullable(repositoryInfo)
    .map(info -> ok(toJson(info)))
    .orElse(Match(ex.getCause()).of(
        Case(of(GithubRepoNotFoundException.class), notFound(toJson("repo not found")),
        Case(any(), internalServerError(toJson("internal error")))));