我正在開發使用Scotty和Persistent的REST後端,我找不出正確的方式來處理錯誤。透明的錯誤處理
我有幾個函數來訪問數據庫,如:
getItem :: Text -> SqlPersistM (Either Error Item)
它的SQL單子內返回無論是。然後,我用它在我的行動來獲取項目,並返回它的JSON表示:
get "/items/:name" $ do
name <- param "name"
eitherItem <- lift $ MyDB.getItem name
case eitherItem of
Left NotFound -> do
status status404
json NotFound
Left InvalidArgument -> do
status status400
json BadRequest
Right item -> json item
我可以讓代碼通過引入一些助手漂亮,但該模式將保持不變 - Access數據庫,檢查錯誤,提供適當的迴應。
我想擺脫錯誤的,我的行爲完全處理:
get "/items/:name" $ do
name <- param "name"
item <- lift $ MyDB.getItem name
-- In case of error, appropriate
-- HTTP response will be sent,
-- else just continue
bars <- lift $ MyDB.listBars
-- In case of error, appropriate
-- HTTP response will be sent,
-- else just continue
json (process item bars)
即getItem
可能會返回錯誤,並且它會以某種方式轉換爲json響應,全都對操作代碼透明。如果getItem
對action和json響應一無所知,那將會很好。
我在過去使用命令式語言解決了這個問題,它通過從各處引發異常,然後將它捕獲到一個地方並呈現適當的響應。我想Haskell也是可以的,但我想知道如何使用功能工具來解決這個問題。
我知道monads可能會短路(如Either >> Either >> Either
),但不知道如何在這個稍微複雜的情況下使用它。
我不認爲'json [item,bars]'甚至會編譯。列表類型是同類的。 – Ankur
是的,我的錯。將修復例子。 – lambdas