我有一組Data.BSON.Document結構,我正在挖掘,將每個轉換爲一個用戶數據結構(我定義的用戶)。做拆包功能是非常簡單的:如何用Haskell的BSON模塊捕捉簡單的錯誤?
docToUser :: Document -> Either String User
docToUser u = do
name <- look "name" u >>= \(String t) -> return $ unpack t
email <- look "email" u >>= \(String t) -> return $ unpack t
token <- look "auth" u >>= \(String t) -> return $ unpack t
Right $ User name email token
美中不足,雖然是實際上它並不似乎在無論哪種情況下錯誤的。下面是一些例子運行:
*DB> docToUser ["name" =: "Savanni", "email" =: "[email protected]", "auth" =: "random_token"]
Right (User {name = "Savanni", email = "[email protected]", token = "random_token"})
*DB> docToUser ["name" =: "Savanni", "email" =: "[email protected]", "a" =: "random_token"]
*** Exception: expected "auth" in [ name: "Savanni", email: "[email protected]", a: "random_token"]
所以,在第一次運行返回包裹Right
構造函數中的用戶。第二個我期望的東西,如Left "field not found"
,但相反得到一個完整的例外。爲什麼會發生這種情況而不是存儲在任一數據結構中的錯誤?
請注意,在後面的所有情況下,您不需要放入'Just(String ..)'行,在之前的情況下,'Nothing'將會捕獲它們,即'case .. of ...; (Nothing,_,_) - > ...; (_,Nothing,_) - > ...; (_,_,Nothing) - > ...'工作得很好。 – huon