在Happstack中捕获异常

时间:2011-10-11 20:56:43

标签: haskell exception-handling happstack

我得到一个异常(在空列表上使用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

1 个答案:

答案 0 :(得分:2)

你是什么意思,“服务器停了下来?”

如果您正在处理请求并执行head [],那应该只会终止处理该特定请求的线程。服务器本身应继续运行并处理其他请求。

如果您找到了杀死整个服务器的方法,那么这将是一个错误,错误报告/测试用例将受到高度赞赏。

如果只有当前线程被杀死,并且你想捕获该异常,那么我认为你需要使用MonadPeelIO,

http://hackage.haskell.org/packages/archive/monad-peel/0.1/doc/html/Control-Monad-IO-Peel.html

有人提交了一个补丁,但尚未审核/合并。