Skala-Weg, um mit Zuständen in Vorstellungen umzugehen?

Ich versuche, eine übersichtliche Konstruktion mit Verständnis für Geschäftslogik zu erstellen, die auf Futures basiert. Hier ist ein Beispiel, das ein Arbeitsbeispiel enthält, das auf der Ausnahmebehandlung basiert:

(for {
  // find the user by id, findUser(id) returns Future[Option[User]]
  userOpt <- userDao.findUser(userId)        
  _ = if (!userOpt.isDefined) throw new EntityNotFoundException(classOf[User], userId)

  user = userOpt.get       

  // authenticate it, authenticate(user) returns Future[AuthResult]
  authResult <- userDao.authenticate(user)   
  _ = if (!authResult.ok) throw new AuthFailedException(userId)

  // find the good owned by the user, findGood(id) returns Future[Option[Good]]
  goodOpt <- goodDao.findGood(goodId)        
  _ = if (!good.isDefined) throw new EntityNotFoundException(classOf[Good], goodId)

  good = goodOpt.get        

  // check ownership for the user, checkOwnership(user, good) returns Future[Boolean]
  ownership <- goodDao.checkOwnership(user, good)
  if (!ownership) throw new OwnershipException(user, good)

  _ <- goodDao.remove(good) 
} yield {
  renderJson(Map(
    "success" -> true
  ))
})
.recover {
  case ex: EntityNotFoundException =>
    /// ... handle error cases ...
    renderJson(Map(
        "success" -> false,
        "error" -> "Your blahblahblah was not found in our database"
    ))
  case ex: AuthFailedException =>
    /// ... handle error cases ...
  case ex: OwnershipException =>
    /// ... handle error cases ...
}

Dies kann jedoch als eine nicht funktionierende oder nicht skalierbare Möglichkeit angesehen werden, mit den Dingen umzugehen. Gibt es einen besseren Weg, dies zu tun?

Beachten Sie, dass diese Fehler aus verschiedenen Quellen stammen - einige befinden sich auf Unternehmensebene ("Kontrolle des Eigentums") und einige auf Controllerebene ("Autorisierung") und einige auf Datenbankebene ("Entität nicht gefunden"). Daher funktionieren Ansätze, wenn Sie sie von einem einzelnen allgemeinen Fehlertyp ableiten, möglicherweise nicht.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage