2011-09-14 14 views
2

私は3つの関数をマップしていますが、例外を捕捉したら評価を停止したいと思います。 私は例外をキャッチすることができますが、私が望む動作を取得していません。私はこの問題を誤った方法で考えている可能性があります(この場合、関数のリストをマップしてはいけません)。私はそれが関連するコードだと思います。例外を捕捉したら関数リストの評価を停止するには

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 

「チャート作成」という文字列は表示されません。例外をスローしたときにリストの評価を中止するにはどうすればよいですか?

+0

このコードでは、ブロック引用符形式ではなくコードブロック形式を使用する必要があります。コードブロックの編集ウィンドウ内のシンボルは、 '' 'の代わりに' {} 'のように見えます。 – rovaughn

答えて

4

mapMは、機能をマップし、次にリストを並べ替えます。したがってリスト内の各アクションの周りに別々にcatchが表示されています。あなたが望むのは、リストを単一のアクションにシーケンスし、次にの例外をキャッチして、リスト内のすべてのものを中断させることです。次のように動作します。

(flip Control.Exception.catch exceptionHandler) $ sequence_ [preProcess world, initiateJob world, makeChart world] 
関連する問題