Я пишу веб-приложение, используя 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))