2012-02-11 22 views
7

ho il seguente codice che utilizza l'API GHC per caricare i moduli e ottenere il tipo di un'espressione:come gestire "panico: l'impossibile è accaduto" e continuare in 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 

Se le espressioni don' t TYPECHECK, l'intero programma va in crash 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]' 

Come posso fare in modo che non vada in crash il programma? Voglio solo sapere quali tipi di espressioni sono stati controllati correttamente e quali no.

+4

Se si è riusciti a bloccare il compilatore, si è verificato un errore del compilatore. Controlla se si tratta di un bug noto, altrimenti segnalalo. – Landei

+0

Non penso che sia un bug. È corretto. Ho provato a compilare in fase di esecuzione un'espressione che ha tentato di passare in una stringa in cui era previsto un Int. Voglio solo "catturare" quell'errore e "contrassegnare" quell'espressione come fallita, mentre gli altri che non causano un errore, lo considero un successo. – mentics

+10

@taotree Segnalare un errore è un comportamento corretto. Schiantarsi con un "panico! (L''impossibile' è successo)" non è un comportamento corretto. Segnalalo come un bug. –

risposta

12

Non è possibile gestirlo - questo è come un "oops" del kernel, e indica che il runtime o il compilatore si trova in uno stato incoerente. Segnalalo come un bug.