2

例外(空のリストでPrelude.headを使用)が発生し、その後すべてのhttp-requestが502/505例外を返しました(そしてhappstackアプリは「HTTPリクエストが失敗しました:リソースの送信が消えました(パイプが壊れています)」と出力しますstdout)。

私の質問はこれです: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

「サーバーがダウンした」とはどういう意味ですか?

リクエストを処理している場合は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 に答える