2011-10-11 138 views
2

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

回答

2

你是什么意思,“服务器去了”?

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

如果你已经找到了杀死整个服务器的方法,那是一个错误和错误报告/测试案例将不胜感激。

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

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

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