2011-10-11 100 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

有人提交了一個補丁,但它有尚未被審查/合併。