2

我遇到了一个异常(在空列表上使用 Prelude.head),之后所有的 http 请求都返回了 502/505 异常(并且 happstack 应用程序打印“HTTP 请求失败:发送资源消失(断管)”标准输出)。

我的问题是:在 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
4

1 回答 1

2

“服务器宕机”是什么意思?

如果您正在处理 Request 并且 do head [],那应该只杀死正在处理该特定请求的线程。服务器本身应该继续运行并处理其他请求。

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

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

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

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

于 2011-10-11T21:56:51.573 回答