Согласно моему пониманию, это происходит потому, что leaderboardCreate
на самом деле не выполняется синхронно с вызовом complete
, как вы могли ожидать. Метод complete
возвращает StandardRoute
, который начинается с Route
и определяется как:
type Route = RequestContext ⇒ Future[RouteResult]
Другими словами, «маршрут» - это функция из контекста в Future
(из RouteResult
). И если вы посмотрите на определение complete
, это просто:
def complete(m: ⇒ ToResponseMarshallable): StandardRoute =
StandardRoute(_.complete(m))
Обратите внимание на ⇒
перед ToResponseMarshallable
. Это передает параметр по имени , который фактически превращает его в ленивую оценку.
Другими словами, все ваши обертки try/catch
- это очень маленький (и свободный от исключений) код построения StandardRoute
, который фиксирует вашу логику как ленивое значение, но не выполнение самой логики. Вот почему вам нужен пользовательский ExceptionHandler , который вы (или, скорее, Akka) фактически можете поместить в цепочку обработчиков ошибок для Future
, когда он будет запущен.