haskell - Happstackで例外をキャッチ

haskell exception-handling happstack

私は例外を受け取り(空のリストでPrelude.headを使用)、その後すべてのhttp-requestが502/505例外を返しました(そして、happstackアプリは「HTTP request failed with:send resource vanished(Broken pipe)」を出力します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
答え
「サーバーがダウンしました」とはどういう意味ですか?

リクエストを処理しているときにhead []を実行すると、その特定のリクエストを処理しているスレッドのみが強制終了されます。サーバー自体は、他の要求の実行と処理を続行する必要があります。

サーバー全体を強制終了する方法を見つけた場合、それはバグであり、バグレポート/テストケースは高く評価されます。

現在のスレッドのみが強制終了されており、その例外をキャッチしたい場合は、MonadPeelIOを使用する必要があると思います。

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

誰かがそのためのパッチを提出しましたが、まだレビュー/マージされていません。
関連記事

haskell - ハスケル。 MongoDBドライバーまたはAeson文字セットの問題

haskell - ソースコードにアクセスせずにGHCiを使用してモジュールをロードする

haskell - yesodをインストールできません

haskell - このHappstackフォームコードの一部をリファクタリングする方法はありますか?

performance - collat​​zチェーンのパフォーマンスの問題

haskell - 独自のデータ型をモナド関数チェーンの戻り値として定義する方法は?

haskell - 型クラスによる関数型シグネチャのクリーンアップ

haskell - Haskellの可変ヒープ構造

haskell - Yesodがインストールに失敗する(つまり、テキストパッケージ)

haskell - wxHaskellのラベルが全文を表示できない