2015-04-30 5 views
1

У меня есть два действия:Как я могу обрабатывать ошибки с помощью ActionBuilder и Action?

object ErrorHandler extends 
    ActionBuilder[Request]{ 
    def invokeBlock[A](request: Request[A], block: (Request[A]) => Future[Result]) = { 
    try { 
     block(request) 
    } catch { 
     case ex: Throwable => Future.successful{ 
     InternalServerError(
      Json.obj(
      "status" -> JsString("error") 
     ) 
     ) 
     } 
    } 
    } 
} 

И еще одно действие:

object WithFieldAction extends 
    ActionBuilder[WithFieldRequest] with ActionTransformer[Request, WithFieldRequest] { 

    val FIELD = "field" 

    def transform[A](request: Request[A]) = Future.successful { 
    new WithFieldRequest(request.getQueryString(FIELD), request) 
    } 
} 

я совмещаю эти действия:

def index = (ErrorHandler andThen WithFieldAction) { implicit request => 
    1/0 
} 

Но ErrorHandler не перехватывает исключение и я вижу страница ошибки по умолчанию. Как я могу это исправить? (Я не могу использовать глобальный обработчик ошибок, потому что хочу иметь разные обработчики для разных групп конечных точек)

ответ

0

Проблема в том, что исключение выбрано в пределах Future и удерживается. Это означает, что когда вы вызываете block(request), он просто вернет Future[Result], который обертывает возможное исключение (сбой Future). Future никогда не должен позволять исключению избежать этого, поэтому обертывание в try/catch ничего не сделает.

Вместо этого вам необходимо recoverFuture.

def invokeBlock[A](request: Request[A], block: (Request[A]) => Future[Result]) = { 
    block(request) recover { ex: Throwable => 
    InternalServerError(
     Json.obj(
     "status" -> JsString("error") 
    ) 
    ) 
    } 
} 

recover принимает PartialFunction[Throwable, ?], так что вы можете быть мелкозернистой об исключениях вы справляетесь, как вы хотите. Например, вы можете восстановить только java.lang.ArithmeticException, и пусть все остальные сбои распространяются на обработку ошибок Play, если хотите.

Смежные вопросы