1

我希望能够向用户返回自定义错误页面和状态,并在发生此类错误时结束ActionT monad 中的计算。我的理解是,这有点像Maybemonad,计算在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 中实现所需的行为?

4

1 回答 1

1

这两个问题都源于Nothing从未进入的案例,因为TR.readMaybe总是成功。打印markTxt并且cowMarkMaybe在后者应该是的情况下Nothing

于 2019-12-12T03:24:40.890 回答