我找不到真正的方式來捕捉純函數在happstack應用程序中拋出的異常。我試過this solution。當IO函數拋出異常時,它可以很好地工作。但是,當純函數拋出異常時,它無法處理它。我的代碼:在happstack中捕捉純函數的例外
{-# LANGUAGE DeriveDataTypeable #-}
module Main where
import Prelude hiding(catch)
import Control.Monad (msum, mzero, join)
import Control.Monad.IO.Class(liftIO)
import Happstack.Server
import Text.JSON.Generic
import qualified Data.ByteString.Char8 as B
import Control.Exception
data Res = Res {res :: String, err :: String} deriving (Data, Typeable)
evaluateIt :: Res
evaluateIt = throw (ErrorCall "Something goes wrong!")
somethingWrong :: IO Response
somethingWrong = return $ toResponse $ encodeJSON $ evaluateIt
errorHandler :: SomeException -> ServerPart Response
errorHandler e = ok $ setHeaderBS (B.pack "Content-Type") (B.pack "application/json") $ toResponse $ encodeJSON $ Res {err = show e, res = ""}
indexHTML = tryIO (Just errorHandler) somethingWrong
main :: IO()
main = do
simpleHTTP nullConf $ msum [ indexHTML ]
tryIO :: Maybe (SomeException -> ServerPart Response)
-> IO a
-> ServerPart a
tryIO mf io = do result <- liftIO $ try io
case (result) of Right good -> return good
Left exception -> handle exception mf
where handle exception (Just handler) = escape $ handler exception
handle _ Nothing = mzero
我在哪裏錯了?
爲什麼拋出純代碼的異常?是的,你*可以*,但通常是一個壞主意。如果你避免這樣做,更容易看到究竟發生了什麼。在純代碼中堅持'Either'或'ExceptT',並根據需要僅使用'throwIO'或類似的方法拋出異常。 – dfeuer