2012-02-11 8 views
7

tengo el siguiente código que utiliza la API GHC para cargar los módulos y obtener el tipo de una expresión:cómo manejar "pánico: sucedió lo imposible" y continúan en Haskell

typeObjects :: [String] -> [String] -> IO [Type] 
typeObjects modules objects = do 
    defaultErrorHandler defaultDynFlags $ do 
    runGhc (Just libdir) $ do 
     dflags <- getSessionDynFlags 
     setSessionDynFlags dflags 
     targets <- mapM ((flip guessTarget) Nothing) modules 
     setTargets targets 
     result <- load LoadAllTargets 
     case result of 
      Failed -> error "Compilation failed" 
      Succeeded -> do 
      m <- mapM (((flip findModule) Nothing) . mkModuleName) modules 
      setContext m [] 
      values <- mapM exprType objects 
      return values 

Si las expresiones don' t typecheck, todo el programa falla con:

TestDynamicLoad: panic! (the 'impossible' happened) 
    (GHC version 7.0.3.20110330 for x86_64-unknown-linux): 
    Couldn't match expected type `GHC.Types.Int' 
      with actual type `[GHC.Types.Char]' 

¿Cómo puedo hacer para que no se cuelgue el programa? Solo quiero saber qué tipo de expresiones verificaron con éxito y cuáles no.

+4

Si logró bloquear el compilador, se trata de un error del compilador. Comprueba si esto es un error conocido, de lo contrario infórmalo. – Landei

+0

No creo que sea un error. Es correcto. Intenté compilar en el tiempo de ejecución una expresión que intentaba pasar en un String donde se esperaba un Int. Solo quiero "atrapar" ese error y "marcar" esa expresión como fallida, mientras que las otras que no causan un error, las consideraré exitosas. – mentics

+10

@taotree Reportar un error es el comportamiento correcto. Chocar con un "pánico" (lo "imposible" sucedió) "no es un comportamiento correcto. Informarlo como un error. –

Respuesta

12

No puede manejarlo, esto es como un kernel 'oops', y significa que el tiempo de ejecución o el compilador están en un estado incoherente. Informarlo como un error.

Cuestiones relacionadas