2015-09-01 3 views
2

У меня есть контроллер, который предоставляет метод в качестве маршрута. В этом методе я называю длительное вычисление, которое возвращает Future [SomeType].Play Framework 2.3 Обработка Будущее в контроллерах

теперь у меня есть следующие:

def compute(id: String) = Action.async { request => 
    val result: Future[SomeType] = compute(id) 
    result.map(value => Ok(transform(value, id))) 
    } 

До сих пор это просто счастливый путь. Что делать, если вычисление (id) приводит к ошибке? Как с этим справиться? Я мог бы обернуть все это в блок Try, но есть ли лучшая альтернатива? Какие-либо предложения?

+5

По умолчанию неудавшееся будущее приведет к ответу на ошибку сервера. Вы можете '.recover' или' .recoverWith' отступать от такого отказа до пользовательского ответа. – cchantep

ответ

2

Мы обычно используем следующую закономерность:

def compute(id: String) = Action.async { request => 
    val result: Future[SomeType] = compute(id) 
    result.map(value => Ok(transform(value, id))) 
    .recover { ex => 
     Logger.error("Something went wrong", ex) 
     InternalServerError 
    } 
} 

Таким образом код ответа HTTP будет 500 INTERNAL SERVER ERROR, поэтому абонент будет проинформирован. Вы также можете добавить подтверждение по параметрам запроса и вернуть 400 BAD REQUEST и т. Д.

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