在基础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约束以捕获异常?
答案 0 :(得分:2)
你做不到。 IOException
并非旨在以这种方式扩展。
通常,您不能无所畏惧地扩展现有数据类型。这是有充分理由的,因为它需要现有的功能来知道如何处理新值。有很多方法,但它们都需要在设计数据类型时考虑到这一点。
我不清楚为什么您希望将自定义异常视为IO异常。如果要捕获这两种类型,只需嵌套catch
的应用程序,每种类型一个。或者最好是扭转局面并允许IO异常包含在您自己的异常类型中。文档已经有很好的例子说明了如何做到这一点。这一切都归结为你想要实现的目标。