我希望能够将自定义错误页面和状态返回给用户,并在发生此类错误时在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中实现所需的行为?
这两个问题都源于Nothing
永远无法TR.readMaybe
成功的案件。打印markTxt
并cowMarkMaybe
在后者应为后者的情况下Nothing
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句