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.
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
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
@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. –