mbr*_*sen 11 haskell try-catch
在以下Haskell代码中:
data Cmd =
CmdExit |
CmdOther
deriving (Read, Show)
guiString2Cmd s =
(return (read s :: Cmd)) `catch` \(e :: SomeException) -> return CmdExit
Run Code Online (Sandbox Code Playgroud)
如果我做:
guiString2Cmd "CmdOther"
Run Code Online (Sandbox Code Playgroud)
一切正常.但是,如果我这样做:
guiString2Cmd "some wrong string"
Run Code Online (Sandbox Code Playgroud)
代码崩溃而不是评估为CmdExit.
如何让代码处理异常而不是崩溃?
Don*_*art 13
使用reads函数,即total,并将失败案例包装为Maybe,如下所示:
Run Code Online (Sandbox Code Playgroud)maybeRead :: Read a => String -> Maybe a maybeRead s = case reads s of [(x, "")] -> Just x _ -> Nothing
maybeRead 是一种非常通用的方法来进行安全解析.