Как перестать оценивать список функций, как только я поймал исключение - PullRequest
2 голосов
/ 14 сентября 2011

У меня есть три функции, которые я отображаю, я хочу прекратить оценку при обнаружении исключения.Я могу поймать исключение, но не получаю желаемого поведения.Возможно, я думаю об этой проблеме неправильно (возможно, мне не следует отображать список функций в этом случае), и был бы признателен за это.Вот то, что я считаю соответствующим кодом.

import qualified Control.Exception as C
data JobException = PreProcessFail
                  | JobFail
                  | ChartFail
                     deriving (Show, Typeable)

instance C.Exception JobException



type ProcessState = MVar ProcessConfig



data ProcessConfig = PConfig { model :: ServerModel
                             , ipAddress :: String
                             , cookie :: Cookie
                             } deriving Show

exceptionHandler :: JobException -> IO ()
exceptionHandler exception = do
   writeFile "testException.txt" ("caught exception " ++ (show exception))
-- much more functionality will be put here once I get the logic correct
preProcess :: ProcessState -> IO ()
preProcess sModel = do
   putStrLn ("preProcessing" )

initiateJob :: ProcessState -> IO ()
initiateJob sModel = do
   C.throw JobFail  
   putStrLn ("in progress")
makeChart :: ProcessState -> IO ()
makeChart sModel = do
     putStrLn ("chart making")

Так что теперь, когда я проверяю это в ghci, вот что происходит.

a <- mapM (flip Control.Exception.catch exceptionHandler) [preProcess world, initiateJob world, makeChart world]
Loading package filepath-1.2.0.0 ... linking ... done.
Loading package unix-2.4.2.0 ... linking ... done.
preProcessing
chart making

Я не должен видеть строку"составление карт".Как прервать оценку списка при создании исключения?

1 Ответ

4 голосов
/ 14 сентября 2011

mapM отображает функцию , затем упорядочивает список.Таким образом, у вас есть catch вокруг каждого действия в списке отдельно.Вам нужно упорядочить список в одно действие, а затем перехватить исключение один раз , прерывая все остальное в списке.Следующие работы:

(flip Control.Exception.catch exceptionHandler) $ sequence_ [preProcess world, initiateJob world, makeChart world]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...