Haskell可扩展的IO异常?

5
在base 4.4.0.0 的Control.Exception文档中,有一个如何创建异常层次结构的示例。该示例展示了如何通过在Exception类的实例中声明父异常来捕获特定异常的泛化。这很酷,但是我该如何使我的异常成为现有异常的子类呢?例如,我想制作通过IOException类型约束捕获的异常。Control.Exception中的示例展示了这一点:
*Main> throw MismatchedParentheses catch (\e -> putStrLn ("Caught " ++ show (e :: SomeCompilerException)))
Caught MismatchedParentheses

*Main> throw MismatchedParentheses catch (\e -> putStrLn ("Caught " ++ show (e :: IOException)))
*** Exception: MismatchedParentheses

我如何使用IOException约束来捕获我的异常?


看起来 Haddock 没有正确地渲染文档。点击 Source 超链接以查看正确的定义(如果我在这里复制它,SO 也可能会错误地渲染它...)。 - stephen tetley
1个回答

1

不行。 IOException 并没有被设计成可以以这种方式进行扩展。

一般来说,你不能随意扩展现有的数据类型。这是有很好的原因的,因为它需要现有的函数知道如何处理新值。虽然有办法绕过这个问题,但它们都需要在设计数据类型时考虑到这一点。

我不清楚你为什么希望将自定义异常视为 IO 异常。如果你想捕获两种类型,只需嵌套应用每种类型的 catch。或者也许更好的方法是将 IO 异常包装在你自己的异常类型中。文档已经有了很好的示例。这归根结底取决于你想要实现什么。


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