带有 String 参数的一般异常
Generic exception with String parameter
我只是想知道是否有任何我可以抛出的通用异常,以防万一我不想在一些简单的脚本中创建自定义异常。
我正在寻找以单个 String
作为原因的异常。
例如 NoMethodError
,但是它有一个特定的语义,我想要一个通用的语义。
https://hackage.haskell.org/package/base-4.16.0.0/docs/Control-Exception.html#t:NoMethodError
这完全取决于你想做什么。
如果你想抛出一个 IO 错误,那么你可以调用 error
, which generates an ErrorCall
异常。您可以选择在 main
函数中捕获它并生成更多 user-friendly 错误消息。这大致相当于大多数其他编程语言提供的异常处理方式。
如果您有一些 non-IO 计算可能会在不同阶段失败(例如,在 Map
中查找某些东西但没有找到它),那么您可以使用 Either String
作为 quick-and-dirty 异常monad。抛出异常的等价物是 Left
.
要使 Either String
更强大,您可以导入 Control.Monad.Except
。这引入了 MonadError
类型类,其中包括 Either
作为实例。因此,通过导入它,您可以使用 throwError
和 catchError
.
或者,您可以使用 ExceptT
monad 转换器(也是 Control.Monad.Except
的一部分)为您正在使用的任何其他 monad 添加异常。
我只是想知道是否有任何我可以抛出的通用异常,以防万一我不想在一些简单的脚本中创建自定义异常。
我正在寻找以单个 String
作为原因的异常。
例如 NoMethodError
,但是它有一个特定的语义,我想要一个通用的语义。
https://hackage.haskell.org/package/base-4.16.0.0/docs/Control-Exception.html#t:NoMethodError
这完全取决于你想做什么。
如果你想抛出一个 IO 错误,那么你可以调用 error
, which generates an ErrorCall
异常。您可以选择在 main
函数中捕获它并生成更多 user-friendly 错误消息。这大致相当于大多数其他编程语言提供的异常处理方式。
如果您有一些 non-IO 计算可能会在不同阶段失败(例如,在 Map
中查找某些东西但没有找到它),那么您可以使用 Either String
作为 quick-and-dirty 异常monad。抛出异常的等价物是 Left
.
要使 Either String
更强大,您可以导入 Control.Monad.Except
。这引入了 MonadError
类型类,其中包括 Either
作为实例。因此,通过导入它,您可以使用 throwError
和 catchError
.
或者,您可以使用 ExceptT
monad 转换器(也是 Control.Monad.Except
的一部分)为您正在使用的任何其他 monad 添加异常。