如何在Haskell中定义自定义异常?

6

Control.Exception文档中说我可以按照以下方式创建自己的异常:

 data MyException = ThisException | ThatException
     deriving (Show, Typeable)

 instance Exception MyException

如果我将这个粘贴到一个文件中,并编译(在导入Control.Exception和Data.Typeable之后),会得到如下结果:
exp.hs:6:20:
    Can't make a derived instance of `Typeable MyException'
      (You need -XDeriveDataTypeable to derive an instance for this class)
    In the data type declaration for `MyException'

我需要打开这个扩展程序才能使用用户定义的异常吗?如果不是,请提供一个示例。谢谢。
2个回答

6

是的,您需要打开该扩展。手动编写Typeable实例并不是一个好主意,因为它与GHC的内部有一些联系。


1
这是否意味着在Haskell中通常没有用户定义的异常? - me2
2
如果你指的是Haskell标准,那么就没有用户定义的异常。如果你指的是GHC实现的扩展语言,那么它们是存在的,如上所述。 - GS - Apologise to Monica

0

是的,你可以轻松地定义异常并使用它。

module Main (main) where
import Control.Exception
import GHC.IO (catchException)
data DropException = DropException deriving (Show)
instance Exception DropException
go = throwIO DropException
main = catchException go (\DropException -> putStrLn "Dropped")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接