问题
I have the following code that uses the GHC API to load modules and get the type of an expression:
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
If the expressions don't typecheck, the whole program crashes with:
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]'
How can I make it so it won't crash the program? I just want to know which expressions type checked successfully and which did not.
回答1:
You can't handle it - this is like a kernel 'oops', and means the runtime or compiler is in an inconsistent state. Report it as a bug.
来源:https://stackoverflow.com/questions/9242996/how-to-handle-panic-the-impossible-happened-and-continue-in-haskell