So fangen Sie eine Ausnahme in runResourceT

8

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%     
jedf 08.06.2012, 17:10
quelle

2 Antworten

8

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.

    
ehird 08.06.2012, 19:06
quelle
0

Alternativ können Sie die MonadCatch Instanz von ResourceT , gefunden im Paket Ausnahmen . Sie müssen einfach die verallgemeinerte Version von catch von Control.Monad.Catch ersetzen:

%Vor%     
Rufflewind 18.03.2015 22:30
quelle

Tags und Links