Перехват исключений в обработчике happstack-lite - PullRequest
2 голосов
/ 20 марта 2012

Я пишу веб-приложение, используя happstack-lite.Когда мой обработчик ответа ServerPart вызывает чистую функцию, а эта функция вызывает error , весь обработчик завершается ошибкой и happstack печатает сообщение об ошибке по умолчанию.

handler :: ServerPart Response
handler = do
    head [] `seq` ok $ toResponse $ H.html "mymessage"

Ошибка сервера: Prelude.head: emptylist

Интересно, можно ли перехватить это исключение и вернуть собственное сообщение.К сожалению, я не могу понять, как использовать catch в монаде ServerPart.

В идеале мой обработчик должен выглядеть следующим образом:

handler :: ServerPart Response
handler = do
    catch 
        (head [] `seq` ok $ toResponse $ H.html "my message") 
        (ok $ toResponse $ H.html "my error")

Обновление: сохранение моего решения для истории

handler :: ServerPart Response
handler = do
    let good = ok $ toResponse $ H.html "my message"
    let bad = ok $ toResponse $ H.html "my error"
    join (liftIO $ catch
        (do
            let n = head (tail [1])
            _ <- print n
            return good
          )
        (\(E.ErrorCall _) -> return bad))

1 Ответ

0 голосов
/ 20 марта 2012

Насколько я знаю, happstack использует монад-контроль, и вы должны иметь возможность использовать его поднятый улов в соответствующем месте (при условии, что вы также соответствующим образом форсируете исключение): http://hackage.haskell.org/package/monad-control-0.3.1

...