【发布时间】:2016-05-31 03:18:27
【问题描述】:
我正在构建一个 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 上出错,我希望它短路,而不是继续处理程序的其余部分。
【问题讨论】:
-
你想“抛出异常”做什么?服务器崩溃?返回一个 HTTP 响应(比如 500 或 404?)
-
返回一个 HTTP 响应(例如 400)以及一条消息。 (例如
{ error: "This should error out" }