我希望能够向用户返回自定义错误页面和状态,并在发生此类错误时结束ActionT monad 中的计算。我的理解是,这有点像Maybe
monad,计算在Nothing
遇到第一个时结束,但会发出最终错误消息(通过 HTTP 发送给用户)。
我有一个看起来像这样的代码片段:
liftIO $ scotty (config & port & fromEnum) $
get "/cow/:mark" $ do
qParams :: DM.Map LTxt.Text LTxt.Text <- DM.fromList <$> params
markTxt <- param "mark"
let intervalTxtMay = DM.lookup "interval" qParams
let cowMarkMaybe = TR.readMaybe $ Txt.unpack markTxt
cowMark <- case cowMarkMaybe of
Nothing -> do
status status404
textLazy $ "Couldn't parse cow mark " ++ markTxt ++ " as integer."
finish
Just cmVal-> pure $ CowMark cmVal
liftIO $ logLogIt Debug lgr ["***** Made it past cowMark ******"]
...
代码至少有两个问题:finish
这里似乎没有做任何特别有用的事情,即计算继续,***** Made it past cowMark ******
每次加载通常会触发 404 的页面时,我仍然在日志中看到该消息。第二个问题是如果没有执行 404 错误,即使它应该是 404,我也会收到 200 响应。
有没有办法在 Scotty 中实现所需的行为?