如何在Haskell中捕获读取异常?

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,如下所示:

maybeRead :: Read a => String -> Maybe a
maybeRead s = case reads s of
    [(x, "")] -> Just x
    _         -> Nothing
Run Code Online (Sandbox Code Playgroud)

maybeRead 是一种非常通用的方法来进行安全解析.

  • 此函数在最近版本中以[`Text.Read.readMaybe`](http://www.haskell.org/ghc/docs/latest/html/libraries/base/Text-Read.html#v:readMaybe)的形式提供"基地". (4认同)