我正在构建一个RESTful端点,如果存在无效数据,该端点应该引发错误。这是一个简化的(有点傻)的版本:
getEventsR :: Handler Value
getEventsR = do
mpage <- lookupGetParam "page"
let filters = case hasPage mpage of
Right val -> val
Left val -> error $ T.unpack val -- Throw an error
-- The rest...
hasPage :: Maybe Text -> Either Text Text
hasPage =
Left "This should error out"
Either
吗-函数应返回,随后将其扩展为错误?error
,对吧?什么呢?附带说明一下,如果抛出的错误也以JSON格式发送,我会很高兴。
更新:
之所以使用“抛出异常”一词,是因为我的代码看起来像这样(简化):
let selectOpt = case addPager [] of
Right val -> val
Left val -> error $ T.unpack val
let filters = case addFilter [] of
Right val -> val
Left val -> error $ T.unpack val
events <- runDB $ selectList filters selectOpt :: Handler [Entity Event]
因此,如果出现错误,selectOpt
我希望它短路,而不要继续处理程序的其余部分。
您可以使用sendResponseStatus
直接指定响应:
getEventsR = do
mpage <- lookupGetParam "page"
case hasPage mpage of
Left message -> sendResponseStatus status400 message
Right val -> ...continue processing with val...
的第二个参数sendResponseStatus
可以是具有ToTypedContent
实例的任何类型。这包括Text
,Value
和其他常见的类型。有关默认情况下已定义此实例的类型,请参见此页面。
更新
回应您的评论...
get404
定义为:
get404 key = do
mres <- get key
case mres of
Nothing -> notFound'
Just res -> return res
notFound' :: MonadIO m => m a
notFound' = liftIO $ throwIO $ HCError NotFound
HCError
是以下HandlerContents
类型的构造函数:
http://hackage.haskell.org/package/yesod-core-1.4.0/docs/Yesod-Core-Types.html#t:HandlerContents
data HandlerContents:
HCContent Status !TypedContent
HCError ErrorResponse
HCSendFile ContentType FilePath (Maybe FilePart)
HCRedirect Status Text
HCCreated Text
HCWai Response
HCWaiApp Application
AnErrorResponse
具有以下构造函数:
data ErrorResponse:
NotFound
InternalError Text
InvalidArgs [Text]
NotAuthenticated
PermissionDenied Text
BadMethod Method
因此,您可以throwIO
限制数量的错误,并且错误消息仅限于Text
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句