2016-06-06 9 views
3

:java.util.concurrent.CompletionStage - 예외 처리 방법은 무엇입니까? 나는 다음과 같은 코드에서 여러 예외를 처리하는 더 좋은 방법을 찾기 위해 노력하고있어

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()입니다.하지만 역시 빠릅니다.

+0

과 같을 것이다 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

+0

너무 넓습니까? – Aleksander

+0

예외를 처리하는 방법은 전체 응용 프로그램을 디자인하는 방법에 따라 다릅니다. 특정 비동기 작업에서이를 처리하는 방법을 알려주는 것은 의미가 없습니다. 나는'ok','notFound'와'internalServerError'라는 세가지 메소드가 기본적으로 동일하고 매개 변수에 캡슐화 될 수있는 작은 상태 (예 : 보낼 HTTP 상태 코드) 만 다를뿐입니다. 그래서이 방법들에 관한 재 설계는 예외를 처리하는 완전히 다른 (아마도 가장 우아한) 방법을 허용 할 것입니다. – Holger

답변

0

if 문에는 특히 유창한 API를 제공하고 특히 instanceof 문에는 라이브러리가 있습니다. 다양한에 방법이다

.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")))));