Ich möchte eine Ausnahme in runResourceT abfangen, ohne die Ressource freizugeben, aber die Funktion catch führt die Berechnung innerhalb von IO aus. Gibt es eine Möglichkeit, eine Ausnahme in runResourceT abzufangen, oder was ist die empfohlene Methode, um den Code zu refaktorieren?
Danke für Ihre Hilfe.
%Vor% ResourceT
ist eine Instanz von MonadBaseControl
aus dem monad-control -Paket, das entworfen wurde, um Kontrollstrukturen wie z forkIO
und catch
in transformierte Monaden.
Das helped-base -Paket, das auf monad-control basiert, enthält Module mit Versionen von Standard-Kontrollstrukturen, die in jedem MonadBaseControl
funktionieren. Für die Ausnahmebehandlung können Sie die Funktionen in der % verwenden. co_de% Modul. Also, nur Control.Exception.Lifted
1 stattdessen, und Ihr Code sollte gut funktionieren.
1 Beachten Sie die import qualified Control.Exception.Lifted as EX
hier; ziemlich verwirrend, qualified
importiert tatsächlich alle Definitionen in import A as B
in den Geltungsbereich und definiert einfach A
als Alias für das Modul! Sie müssen B
verwenden, um sicherzustellen, dass die Definitionen nicht in den Gültigkeitsbereich einbezogen werden und stattdessen ausschließlich über den Alias qualified
zugegriffen wird.
Alternativ können Sie die MonadCatch
ResourceT
, gefunden im Paket Ausnahmen . Sie müssen einfach die verallgemeinerte Version von catch
von Control.Monad.Catch
ersetzen:
Tags und Links haskell