ほとんど味の問題です。私はあなたが、フローベースのクライアントを使用している場合にも、エラー
val decider: Decider = {
case ex =>
ex.printStackTrace()
Supervision.Stop // Passes error down to subscriber
}
を処理するためにDecider
を指定してmaterializer
のいずれかでそれを使用することができ、通常
Future[Try[HttpResponse]]
に
Future[HttpResponse]
を変換し
response.flatMap { tryResp =>
tryResp match {
case Success(res) =>
res.status match {
case OK =>
// Unmarshal response here into Future[Something]
case Found =>
// Handle redirect by calling requestBlhBlah() again with anotehr URI
case _ =>
// I got status code I didn't expect so I wrap it along with body into Future failure
Unmarshal(res.entity).to[String].flatMap { body =>
Future.failed(new IOException(s"The response status is ${res.status} [${request.uri}] and response body is $body"))
}
}
case Failure(ex) =>
Future.failed(ex)
}
}
としてそれを扱います.withAttributes(ActorAttributes.supervisionStrategy(decider))
介し
implicit val materializer = ActorMaterializer(ActorMaterializerSettings(system).withSupervisionStrategy(decider))(system)
またはフロー単位で
Future
によると、それはどのように処理するかはあなた次第です。 recoverWith
を使用して障害を何かに変換したり、Future.onFailure
にログインしたりできます。
Ahm ...同じことをやっていますが、Tryの代わりにどちらかを使用します。最終結果は、すべてが正常であればFuture [Something]が返されます。そうでなければ失敗した未来が返されます。元の応答(Future [HttpResponse])、または対象サービスからの既知のエラー応答のために定義した何らかの顧客例外 – EugeneMi
しかし、(1)将来返される例外はスーパーバイザに伝達されることはないため、クライアントが返すことができる例外を知っていて、それを処理したりログしたりする必要があります – EugeneMi
私の答えにさらに追加しました。 – expert