2017-02-19 3 views
1

나는 간단한 동작 기능이 있습니다내부 함수를 통해 Action 함수로 예외를 반환하는 방법?

def someActionFunc() = Action.async { request => 

myService.doSomething1().map { res => 
     logger.debug(res.getMessageId) 
     Ok(res.getMessageId) 
     }.recover { 
     case ex => 
      logger.error(s"fail:", ex) 
      BadRequest(s"fail with error: ${ex.getMessage}") 
     } 
} 

doSomething1Future을 반환, 그리고 doSomething1에서 나는 약간의 개체와 예외가 일어난 반환 다른 기능 doSomething2를 호출하고있어,하지만 난 방법을 모르는

: 나는 그래서 내가 좋아하는 뭔가를 doSomething2에서 재판을 fail with error: my reason

사용자에게 반환 할 원인 조치 기능 (someActionFunc)에 doSomething1을 통해 doSomething2에서 일어난 오류를 반환

def doSomething2(someCondition: Boolean) = { 
     if (someCondition){ 
     throw new RuntimeException("my reason") 
     } 
    } 

하지만 나는 어떻게 행동 기능을 던져 사용자에게 적절하게 오류를 반환 할 수 있습니까?

답변

2

스칼라에서 Future[T]은 실제로 완료하는 데 약간의 시간이 걸리는 Try[T]입니다. 차례대로 Try[T]만이 Success[T] 또는 Failure[T] 일 수 있습니다. Failure[T]은 실제로 예외를 감싸는 래퍼입니다.

하여 오류 처리 체인이 작동하지 않는 이유는 (기능에서 완전히 반환 값에 을 기반으로) 처리 스칼라의 기능적인 스타일을 우회 대신 Java 스타일을 throw 관용구를 사용하고 있다는 것입니다 - 물론 어떤 JVM에서는 여전히 작동하지만 스칼라에서는 관용적이지 않습니다.

이 같은 doSomething2 다시 작성하는 경우 :

def doSomething2(someCondition: Boolean):Future[Int] = { 
    if (someCondition){ 
    Future.failed(new RuntimeException("my reason")) 
    } else { 
    Future.succesful(42) 
    } 
} 

을 당신은 관용적 스칼라 오류 처리 당신이 찾고있는거야.

몇 가지 참고 사항 :

  • 내가 편리하게 내 가능한 결과
  • 내가Exception 인스턴스를 생성 있지만 주위에 필요한 래퍼를 구축하기 위해 Future객체failed()successful() 방법을 사용, 내가 결코throw 그것
  • 나는 exp 컴파일러가 정확성을 보장하는 데 도움이되는 doSomething2의 반환 유형을 명시 적으로 명시 - 이전에 doSomething2의 반환 유형은 무엇입니까? Unit?
관련 문제