我得到一个异常(在空列表上使用Prelude.head),在此之后使所有http请求返回502/505异常(并且happstack应用程序打印“HTTP请求失败并且:send resource消失了(Broken pipe) )“在stdout中。”
我的问题是:在Happstack中控制异常的最佳做法是什么?我应该使用simpleHTTP之外的其他东西,还是只在控制器函数上使用Control.Exception.catch?
目前看起来与Crash Course中的示例类似:
main :: IO ()
main = do
hSetEncoding stdout utf8
bracket (startSystemState (Proxy :: Proxy AppState)) createCheckpointAndShutdown $
\_control ->
simpleHTTP nullConf { port = 1729 } $ do
_ <- liftIO today
decodeBody policy
controller
where
createCheckpointAndShutdown control = do
createCheckpoint control
shutdownSystem control
答案 0 :(得分:2)
你是什么意思,“服务器停了下来?”
如果您正在处理请求并执行head []
,那应该只会终止处理该特定请求的线程。服务器本身应继续运行并处理其他请求。
如果您找到了杀死整个服务器的方法,那么这将是一个错误,错误报告/测试用例将受到高度赞赏。
如果只有当前线程被杀死,并且你想捕获该异常,那么我认为你需要使用MonadPeelIO,
http://hackage.haskell.org/packages/archive/monad-peel/0.1/doc/html/Control-Monad-IO-Peel.html
有人提交了一个补丁,但尚未审核/合并。