2011-09-24 18 views
5

En la documentación para Control.Exception en la base 4.4.0.0, hay un ejemplo de cómo hacer jerarquías de excepción. El ejemplo muestra cómo se pueden detectar generalizaciones de excepciones específicas declarando instancias de la clase Exception en términos de la excepción padre. Esto es genial, pero ¿cómo puedo hacer que mis excepciones sean hijos de excepciones existentes? Por ejemplo, quiero hacer excepciones atrapadas por restricciones de tipo en IOException. El ejemplo de la Control.Exception muestra esto:Haskell Extensible IO Exceptions?

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

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

¿Cómo puedo obtener las limitaciones IOException de recuperar excepciones?

+0

Parece que Haddock no ha procesado la documentación correctamente. Haga clic en el hipervínculo de 'Fuente' para ver la definición correcta (si la copio aquí, SO probablemente también la interpretará incorrectamente ...) –

Respuesta

2

No puede. IOException no está diseñado para ser extensible de tal manera.

En general, no puede extender los tipos de datos existentes de cualquier manera. Hay una buena razón para eso, ya que requeriría funciones existentes para saber qué hacer con los nuevos valores. Hay formas de evitar esto, pero todas requieren que el tipo de datos se diseñe con esto en mente.

No está claro para mí por qué quiere que sus excepciones personalizadas se traten como excepciones IO, sin embargo. Si desea capturar ambos tipos, solo anide las aplicaciones de catch, una para cada tipo. O tal vez sería mejor cambiar las cosas y permitir que las excepciones IO se envuelvan dentro de su propio tipo de excepción. La documentación ya tiene buenos ejemplos de cómo hacer eso. Todo se reduce a lo que estás tratando de lograr.