Перехват исключений в Happstack

#haskell #exception-handling #happstack

#haskell #исключение #happstack

Вопрос:

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

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

В настоящее время это похоже на пример из ускоренного курса:

 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:

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

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

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

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

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

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