MaybeT und Transaktionen in runDb

Für meine vorherige Frage zu Verkettungsfehlern hatte Michael Snoyman vorgeschlagen, dass ich @ verwendMaybeT, um sie auszuführen. Wenn einer von ihnen fehlschlägt, wird nur ein Kurzschluss nach @ ausgeführNothing.

Ich hatte den EindruckrunDb führt alles in einer Transaktion aus. Sollte also ein Fehler an keiner Stelle im Code die Transaktion automatisch zurücksetzen?

mauth <- runDb $ runMaybeT $ do
            valid    <- MaybeT $ return $ listToMaybe errs 
            uid      <- MaybeT $ insertUnique u 
            vid     <- MaybeT $ getBy $ UniqueField v -- this step fails but previous insert does not roll back
            auth     <- liftIO $ createAuthToken uid
            return auth

Wenn ich den obigen Code ausführe, wird dasgetBy schlägt fehl, aber Benutzer wurde noch eingefügt. Verstehe ich das falschrunDb wird auf einem @ zurückgesetNothing InnerhalbMaybeT? Muss ich eine andere Monade verwenden, damit dies funktioniert?

Bewerten Sie Ihre Überlegungen, wie Sie bei Fehlern am besten ein Rollback durchführen können.

Aktualisiere: Dies ist, was ich auf Michaels Vorschlag hin getan habe.

mauth <- runDb $ do
          ma <- runMaybeT $ do
                   valid <- ... 
          case ma of
            Just _ -> return ma
            Nothing -> liftIO $ throwIO MyException

Nun muss ich herausfinden, wie ich diese Ausnahme schön draußen abfangen und eine richtige Fehlermeldung zurückgeben kann.

Vielen Dank

Antworten auf die Frage(2)

Ihre Antwort auf die Frage