我正在尝试找到更好的方法来处理以下代码中的多个异常:
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()
会返回对象或引发GithubRepoNotFoundException
或GithubApiException
。这个instanceof
看起来很丑陋,我对此并不满意。另一种选择是rethrow ex.getCause()
但它也很糟糕。
答案 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")))));