2017-02-19 43 views
1

У меня есть простая функция действия:Как вернуть исключение из функции действия через внутреннюю функцию?

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}") 
     } 
} 

doSomething1 возвращает Future, и в doSomething1 я звоню некоторые другие функции doSomething2, которая возвращает некоторый объект и исключение там произошло, но я не знаю, как возвращает ошибку, которая произошла в doSomething2 через doSomething1 к функции действия (someActionFunc), потому что я хочу, чтобы вернуть пользователю fail with error: my reason

Так что я попытался в doSomething2 сделать что-то вроде:

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

но я получаю выброшенным, как я могу правильно вернуть ошибку пользователю, чтобы запустить функцию действия?

ответ

2

В Scala, Future[T] действительно просто Try[T], что занимает некоторое время. В свою очередь, Try[T] может только быть Success[T] или Failure[T] - где Failure[T] действительно просто обертка вокруг исключения.

Причина, почему ваша ошибка обработки цепи не работает, что вы обходя функциональный стиль Scala по обработке (на основе полностью на возвращаемых значений из функций) и вместо того, чтобы с помощью Java-стиле throw идиома - что, конечно, все еще работает в JVM, но не Scala-идиоматично.

Если переписать doSomething2 так:

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

вы получите идиоматическое Scala обработки ошибок вы ищете.

Некоторые вещи, чтобы отметить:

  • Я использую failed() и successful() методы на Futureобъекта удобно построить необходимые обертки вокруг моих возможных исходов
  • Хотя я создать в Exception экземпляр, I никогдаthrow it
  • У меня есть exp законно указал тип возврата doSomething2, чтобы помочь компилятору обеспечить правильность - каков был тип возврата doSomething2? Unit?