これは、ここでの私の以前の質問からの提案に基づいています:
go bs = do
r <- try $ parseRequest reader bs secure
case r of
Left ex -> do
putStrLn "got exception"
exceptionHandler writer ex
go empty
Right (request, bs') -> do
sendResponse writer =<< app request
go bs'
例外がなければ、Right 部分は問題なく動作します。ただし、例外がスローされると、例外は一番上までバブルし、Left は実行されません。それがどのような例外であるかは問題ではないようです。
キャッチするはずの例外は次のとおりです(ただし、キャッチしませんerror
):
data ParseError
= Unexpected
| MalformedRequestLine ByteString
| MalformedHeader ByteString
| MissingHeader ByteString Headers
| UnknownSIPVersion ByteString
deriving (Typeable, Show, Eq)
instance Exception ParseError
以下は、exceptionHandler のタイプです。
exceptionHandler :: (ByteString -> IO ())
-> ParseError
-> IO ()
また、これは ghc のバージョン 7.4.1 です。
理由はありますか?