2012-02-11 77 views
7

我有一個使用GHC API來加載模塊,並得到一個表達的類型,下面的代碼:如何處理「恐慌:不可能發生的事情」,並繼續在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 

如果表達式別整個程序崩潰了:

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]' 

我該如何使它不會崩潰程序?我只想知道哪些表達式類型檢查成功,哪些沒有。

+4

如果你設法使編譯器崩潰,這是一個編譯器錯誤。檢查這是一個已知的錯誤,否則報告它。 – Landei 2012-02-11 19:09:13

+0

我不認爲這是一個錯誤。這是正確的。我試圖在運行時編譯一個表達式,試圖傳遞一個字符串在一個Int期望的地方。我只是想「捕捉」那個錯誤,並且把「表達」標記爲失敗,而其他的那些不會導致錯誤的東西,我會認爲是成功的。 – mentics 2012-02-11 19:13:31

+10

@taotree報告錯誤是正確的行爲。 「驚慌失措(發生'不可能')」是不正確的行爲。將它報告爲一個錯誤。 – 2012-02-11 20:55:09

回答

12

你不能處理它 - 這就像一個內核'oops',並且意味着運行時或編譯器處於不一致的狀態。將它報告爲一個錯誤。