Jak sobie z tym poradzić, jeśli w przyszłości zwrócony zostanie nieudany wyjątek?Kontynuuj, gdy Future.failed (nowy wyjątek ("")) zostanie zwrócony w Scali
Scenariusz jest, że mój kod wywołuje getValue()
, odwzorowuje wynik verifyValue()
a następnie chcę, aby móc obsłużyć przypadek, gdy wynik getValue() jest Future.failed(new Exception("message"))
. Jednak gdy uruchomię to, jeśli wynik getValue() jest nieudaną przyszłością, po prostu wyrzuca wyjątek zamiast go obsługiwać.
Czy ktoś ma jakieś sugestie, w jaki sposób to zrobić?
def method(): Future[JsObject] = {
getValue().flatMap(verifyValue(_))
}
def getValue(): Future[JsObject] = {
try {
value1 <- getValue1()
value2 <- getValue2(value1)
} yield {
value2
}
}
def verifyValue(result: Any): Future[JsObject] = {
result match {
case e: Exception =>
getValue()
case json: JsObject => Future.successful(json)
}
}
Aktualizacja: nie sądzę, ja to jasno z pierwotnego pytania, ale dlatego, że flatmap wartości jest to, że nie chcę, aby jawnie trzeba czekać na którykolwiek z kontraktami w mój kod, a więc nie chcę używać Future.onComplete {} do rozwiązania tej wartości.
Aktualizacja 2: Kolejną rzeczą, która może nie być jasna, jest to, że jeśli zgłasza wyjątek, chcę wywołać inną metodę. Nie chcę, aby po prostu obsługiwał wyjątek, będzie rejestrował wyjątek, a następnie wywoływał inną metodę, której wartość zwracana jest tego samego typu co getValue().
Brzmi tak, jak chcesz http://johnkurkowski.com/posts/accumulating-multiple-failures-in-a-ValidationNEL/ – Yawar
Brzmi niewiarygodnie! – annedroiid
Dzięki, ale jestem zbyt leniwy, aby napisać odpowiedź godną nagrody, a także post robi całkiem dobrą robotę wyjaśniając pojęcia :-) – Yawar