我是 Haskell 的菜鸟,所以我不完全确定这是 Happstack 问题还是一般 Haskell 问题。
这是我遇到的困难的一个例子。这段代码“理论上”渲染了一些内容,但实际上抛出了一个错误:
throwsError :: String
throwsError = fromJust Nothing
-- no error page
main :: IO ()
main = do
simpleHTTP nullConf $ do
decodeBody (defaultBodyPolicy "/tmp/" 4096 4096 4096)
ok $ toResponse throwsError
此错误不会使整个程序崩溃。幸运的是,Happstack 可以捕获在处理请求时抛出的任何错误,就像 Web 服务器应该做的那样。但是,不幸的是,它不会向用户显示任何类型的错误页面。它以状态码 200 和空内容响应。
现在,如果我只是先输出错误字符串:
-- yes error page
main :: IO ()
main = do
simpleHTTP nullConf $ do
decodeBody (defaultBodyPolicy "/tmp/" 4096 4096 4096)
lift $ putStrLn throwsError -- added this line
ok $ toResponse throwsError
Happstack 返回状态 500 并显示错误页面。为什么 Happstack 会这样?
ServerPart
monad 实现了MonadThrow
,所以我尝试导入Control.Monad.Catch (handle)
和编写它,但它没有达到我的预期;它再次返回 200 没有内容:
showErrorPage :: SomeException -> ServerPart Response
showErrorPage _ = internalServerError $ toResponse "Error"
-- also no error page
main :: IO ()
main = do
simpleHTTP nullConf $ handle showErrorPage $ do
decodeBody (defaultBodyPolicy "/tmp/" 4096 4096 4096)
ok $ toResponse throwsError
如果不清楚,我想处理所有抛出的错误,以便记录它们并显示自定义错误页面。(当然,记录和显示错误页面时抛出的错误除外)。指导将不胜感激。