#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
Кто-то отправил исправление для этого, но оно еще не было просмотрено / объединено.