2012-03-21 5 views
7

Vamos a hacer las siguientes suposiciones:¿Hay alguna forma de obtener el tipo de excepción en Haskell?

  • mi programa aborta debido a una excepción no capturada
  • que no tienen idea de lo que el tipo de esa excepción es
  • el mensaje de error impreso contiene ninguna pista sobre el tipo de excepción

¿Cómo puedo averiguar el tipo de esa excepción?

ejemplo Mínimo:

main = error "foo" 

(. Aquí es por supuesto ErrorCall, pero no se puede decir que desde el mensaje de error)

Respuesta

16

Sí. Todos los tipos Exception deben ser instancias de Typeable, suponiendo que utilice la nueva API de excepciones.

import Control.Exception 
import Data.Typeable 
import Prelude hiding (catch) 

realMain = error "example" 
main = realMain `catch` h where 
    h (SomeException e) = do 
    putStrLn $ "Caught exception of type " ++ show (typeOf e) 
    putStrLn $ show e 

Resultados:

 
Caught exception of type GHC.Exception.ErrorCall 
example 
+0

¿Has probado esto? No lo he hecho, pero supongo que esto imprimirá 'SomeException'. – user1078763

+2

El código de Haskell '(SomeException e)' does ** not ** significa que 'e' tiene el tipo' SomeException', que se escribiría 'e :: SomeException' (pero que no puede aparecer en los patrones). La única apariencia de 'SomeException' anterior es como un constructor. Entonces hay dos cosas llamadas 'SomeException': el tipo y el constructor. –

+0

Ah, no he leído su código correctamente. Entonces sí, eso funcionará. No en la primera oportunidad de excepciones que se encuentran en lo más profundo de la jerarquía, pero puedo llegar paso a paso. – user1078763

Cuestiones relacionadas