2011-09-24 114 views
5

在基于4.4.0.0的Control.Exception的文档中,有一个如何创建异常层次结构的示例。该示例显示了如何通过根据父例外声明Exception类的实例来捕获特定异常的泛化。这很酷,但我如何让现有例外的子例外。例如,我想要在IOException异常时捕获类型约束。 Control.Exception中的示例显示:Haskell可扩展IO异常?

*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

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

回答

2

你不能。 IOException不是以这种方式可扩展的。

通常,您不能无限地扩展现有的数据类型。有一个很好的理由,因为它需要现有的功能来了解如何处理新的值。有办法解决这个问题,但是他们都需要设计数据类型。

我不清楚为什么您希望将自定义异常视为IO异常。如果你想捕获这两种类型,只需嵌套catch的应用程序,每种类型一个。或者,也许最好是将事物转向并允许将IO异常封装在您自己的异常类型中。该文档已经有很好的例子说明了如何做到这一点。这一切都归结于你想要实现的目标。