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
「チャート作成」という文字列は表示されません。例外をスローしたときにリストの評価を中止するにはどうすればよいですか?
このコードでは、ブロック引用符形式ではなくコードブロック形式を使用する必要があります。コードブロックの編集ウィンドウ内のシンボルは、 '' 'の代わりに' {} 'のように見えます。 – rovaughn