Haskell可扩展IO异常?

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

在base 4.4.0.0中的文档中,有一个如何创建异常层次结构的示例。该示例显示了如何通过根据父异常声明异常类的实例来捕获特定异常的泛化。这很酷,但是我如何使我的异常成为现有异常的子级呢。例如,我想创建由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约束以捕获我的异常?

您不能
IOException
的设计目的不是以这种方式进行扩展

通常,您不能随意扩展现有的数据类型。这是一个很好的理由,因为它需要现有函数知道如何处理新值。有很多方法可以解决这个问题,但它们都要求在设计数据类型时牢记这一点


但我不清楚为什么要将自定义异常视为IO异常。如果要捕获这两种类型,只需嵌套
catch
的应用程序,每种类型一个。或者,最好扭转局面,允许IO异常包装在您自己的异常类型中。文档中已经有了很好的例子来说明如何做到这一点。这一切都取决于您试图实现的目标。

看起来Haddock没有正确呈现文档。单击
Source
超链接查看正确的定义(如果我在这里复制它,那么可能也会错误地呈现它…)