でみてくださいでラップ:が、私は将来を返すレポメソッドを持っているのScala
def insert(newUser: User): Future[User]
この方法では、様々な理由で失敗することができ、しかし、私はこれらの理由の1をキャッチできるようにしたいです他の人を転覆させる。 私は単に結果として試してみてください
Try(userRepository.insert(usr)) match {
case Success(newUserFuture) => newUserFuture
case Failure(e) if e.getCause.getMessage.contains("duplicate key") => {
logger.warn(e.getMessage)
throw DuplicateEntityException("duplicate user record")
}
case Failure(e) => {
logger.error(e.getMessage)
throw e
}
}
とのコールをラップしていた場合、私はTry[Future[User]]
を取得していますが、この状況では、どちらの障害の未来が正常に作成されて以来、発生します。 この時点で、私はそれに対処する方法がわかりません。理想的には、Future[Either[String, User]]
(またはそれに類するもの)を手に入れたいです。
この状況にどう対処すればよいですか、まったく間違った方向に向いていますか?
EDIT以下の推奨 このような解決策 私が試した何か:私はあなたのコードをクリーンアップあなたのアプローチを逆にし、ケースにはガードを使用することができると思う
userRepository.insert(usr).map(newUser => Right(newUser)) recoverWith {
case e: PSQLException if e.getMessage.contains("duplicate key") =>
Future.successful(Left("duplicate user record"))
}
私はあなたが何を意味するか分かりません –
@ShurikAgulyanskyは説明を追加しました – pamu
私は例外を1種類だけ捕まえることができるように未来をアンラップする方法はありますか? –