3
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
중 하나를 throw합니다. 이 instanceof
정말 못 생겼고 나는 그것에 만족하지 않습니다. 또 다른 옵션은 rethrow ex.getCause()
입니다.하지만 역시 빠릅니다.
과 같을 것이다 javaslang matcher와 자바의
Optional
핸들러를 사용. 게다가 그 람다 식을 단순화 할 수 있습니다 :'.handle ((repositoryInfo, ex) -> repositoryInfo! = null?) Json.toJson (repositoryInfo) : ex.getCause() instanceof GithubRepoNotFoundException? notFound (Json.toJson "repo not found")) : internalServerError (Json.toJson ("internal error")))'(SO 주석이 허용하는 것보다 좋은 형식을 상상해보십시오 ...) – Holger
너무 넓습니까? – Aleksander
예외를 처리하는 방법은 전체 응용 프로그램을 디자인하는 방법에 따라 다릅니다. 특정 비동기 작업에서이를 처리하는 방법을 알려주는 것은 의미가 없습니다. 나는'ok','notFound'와'internalServerError'라는 세가지 메소드가 기본적으로 동일하고 매개 변수에 캡슐화 될 수있는 작은 상태 (예 : 보낼 HTTP 상태 코드) 만 다를뿐입니다. 그래서이 방법들에 관한 재 설계는 예외를 처리하는 완전히 다른 (아마도 가장 우아한) 방법을 허용 할 것입니다. – Holger