2012-02-11 30 views
7

Tôi có đoạn code sau đó sử dụng API GHC để nạp mô-đun và nhận được các loại của một biểu thức:Làm thế nào để xử lý "hoảng loạn: những điều không thể xảy ra" và tiếp tục trong 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 

Nếu các biểu thức don' t typecheck, toàn bộ chương trình gặp sự cố với:

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

Tôi làm cách nào để nó không làm hỏng chương trình? Tôi chỉ muốn biết loại biểu thức nào được kiểm tra thành công và loại nào không.

+4

Nếu bạn quản lý để sụp đổ các trình biên dịch, đó là một lỗi biên dịch. Kiểm tra xem đây có phải là lỗi đã biết không, hãy báo cáo lỗi đó. – Landei

+0

Tôi không nghĩ rằng đó là một lỗi. Đúng. Tôi đã cố gắng biên dịch tại thời gian chạy một biểu thức đã cố gắng để vượt qua trong một String, nơi một Int được mong đợi. Tôi chỉ muốn "bắt" rằng lỗi và "dấu ấn" mà biểu hiện như thất bại, trong khi những người khác mà không gây ra một lỗi, tôi sẽ xem xét là thành công. – mentics

+10

@taotree Báo cáo lỗi là hành vi đúng. Crashing với một "hoảng sợ! ('Không thể' xảy ra)" là không đúng hành vi. Báo cáo nó dưới dạng lỗi. –

Trả lời

12

Bạn không thể xử lý nó - điều này giống như một hạt nhân 'oops', và có nghĩa là thời gian chạy hoặc trình biên dịch là trong tình trạng không nhất quán. Báo cáo nó dưới dạng lỗi.

Các vấn đề liên quan