在Happstack中捕获异常
问题描述:
我得到一个异常(在空列表中使用Prelude.head),在所有http请求之后返回502/505异常(并且happstack应用程序打印出“HTTP请求失败:发送资源消失(损坏的管道)“在标准输出中)。在Happstack中捕获异常
我的问题是:在Happstack中控制异常的最佳做法是什么?我应该使用其他的东西而不是simpleHTTP,或者只是在控制器功能上使用Control.Exception.catch?
目前,它类似于在速成班的例子:
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
答
你是什么意思,“服务器去了”?
如果您正在处理请求并执行head []
,那应该只会终止处理该特定请求的线程。服务器本身应该继续运行并处理其他请求。
如果你已经找到了杀死整个服务器的方法,那是一个错误和错误报告/测试案例将不胜感激。
如果只有当前线程被杀害,并且要捕获了异常,那么我认为你需要使用MonadPeelIO,
http://hackage.haskell.org/packages/archive/monad-peel/0.1/doc/html/Control-Monad-IO-Peel.html
有人提交了一个补丁,但它有尚未被审查/合并。