我只是想知道如果我不想在一些简单的脚本中创建自定义异常,是否可以抛出任何通用异常。
我正在寻找一个以单个 String
作为原因的异常。
作为一个例子,NoMethodError
,但是它有一个特定的语义,我想要一个通用的语义。
https://hackage.haskell.org/package/base-4.16.0.0/docs/Control-Exception.html#t:NoMethodError
最佳答案
这取决于您想要做什么。
如果你想抛出 IO 错误,那么你可以调用 error
,生成 ErrorCall
异常(exception)。您可以选择在 main
函数中捕获该错误,并生成更加用户友好的错误消息。这大致相当于大多数其他编程语言提供的异常处理方式。
如果您有一些非 IO 计算可能在各个阶段失败(例如,在 Map
中查找某些内容但没有找到它),那么您可以使用 Either String
作为一个快速而肮脏的异常单子(monad)。相当于抛出异常的是Left
。
要使 Either String
更强大,您可以导入 Control.Monad.Except
。这引入了 MonadError
类型类,其中包含 Either
作为实例。因此,通过导入它,您可以使用 throwError
和 catchError
。
或者您可以使用 ExceptT
monad 转换器(也是 Control.Monad.Except
的一部分),为您正在使用的任何其他 monad 添加异常。
关于haskell - 带字符串参数的通用异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71125378/