在基础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约束来捕获我的异常?
你不能。IOException并不是为了以这种方式可扩展而设计的。
一般来说,您不能随意扩展现有的数据类型。这是有充分理由的,因为它需要现有函数知道如何处理新值。有很多方法可以解决这个问题,但它们都要求在设计数据类型时考虑到这一点。
不过,我不清楚为什么您希望将自定义异常视为 IO 异常。如果您想捕获这两种类型,只需嵌套 的应用程序catch,每种类型一个。或者也许最好扭转局面并允许 IO 异常包装在您自己的异常类型中。该文档已经提供了如何做到这一点的很好的示例。这一切都取决于您想要实现的目标。
| 归档时间: | 
 | 
| 查看次数: | 327 次 | 
| 最近记录: |