Поймать исключения в Happstack - PullRequest
2 голосов
/ 12 октября 2011

Я получил исключение (использовал Prelude.head в пустом списке), после которого все http-запросы после этого возвращали исключение 502/505 (и приложение happstack печатает «HTTP-запрос не выполнен: отправка ресурса исчезла (сломанный канал ) "в стандартный вывод).

Мой вопрос таков: как лучше всего управлять исключениями в Happstack? Должен ли я использовать что-то еще, кроме simpleHTTP или просто использовать Control.Exception.catch для функции контроллера?

В настоящее время выглядит как пример в Crash Course:

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

1 Ответ

2 голосов
/ 12 октября 2011

Что вы подразумеваете под «сервер вышел из строя»?

Если вы обрабатываете запрос и делаете head [], это должно уничтожить только тот поток, который обрабатывает этот конкретный запрос.Сам сервер должен продолжать работать и обрабатывать другие запросы.

Если вы нашли способ убить весь сервер, то это ошибка, и отчет об ошибках / тестовый пример будут высоко оценены.

Если уничтожается только текущий поток, и выхотите поймать это исключение, тогда я думаю, что вам нужно использовать MonadPeelIO,

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

Кто-то представил патч для этого, но он еще не был рассмотрен / объединен.

...