Làm cách nào để xử lý nếu một tương lai trả về ngoại lệ không thành công?Tiếp tục khi một Future.failed (ngoại lệ mới ("")) được trả lại trong Scala
Kịch bản là mã của tôi gọi getValue()
, ánh xạ kết quả đến verifyValue()
và sau đó tôi muốn có thể xử lý trường hợp kết quả của getValue() là Future.failed(new Exception("message"))
. Tuy nhiên khi tôi chạy điều này, nếu kết quả của getValue() là một tương lai không thành công nó chỉ ném ngoại lệ hơn là xử lý nó.
Có ai có bất kỳ đề xuất nào về cách tôi thực hiện việc này không?
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)
}
}
Cập nhật: Tôi không nghĩ rằng tôi thực hiện điều này rõ ràng với câu hỏi ban đầu, nhưng lý do tại sao tôi flatMap giá trị là tôi không muốn dứt khoát phải đợi cho bất kỳ thị trường kỳ hạn trong mã của tôi, và do đó tôi không muốn sử dụng Future.onComplete {} để giải quyết giá trị.
Cập nhật 2: Một điều khác có thể không rõ ràng là nếu nó ném một ngoại lệ, tôi muốn gọi phương thức khác. Tôi không muốn nó chỉ xử lý ngoại lệ, nó sẽ ghi lại ngoại lệ và sau đó gọi một phương thức khác có giá trị trả về bằng cùng kiểu với getValue().
Có vẻ như bạn muốn http://johnkurkowski.com/posts/accumulating-multiple-failures-in-a-ValidationNEL/ – Yawar
Điều đó thật tuyệt vời! – annedroiid
Xin cảm ơn, nhưng tôi quá lười biếng để đánh giá một câu trả lời xứng đáng, và bài đăng cũng có một công việc khá tốt giải thích các khái niệm :-) – Yawar