2012-02-11 3 views
7

계속 나는이 모듈을로드하고 표현의 유형 얻기 위해 GHC API를 사용하여 다음 코드를는 방법 "패닉 : 불가능한 일이"처리하고 하스켈

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 

표현이 돈 경우를 ' t typecheck, 전체 프로그램이 충돌 함 :

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

+0

나는 그것이 버그라고 생각하지 않는다. 맞습니다. 나는 Int가 예상되는 String을 전달하려고 시도한 표현식을 런타임에 컴파일하려고했습니다. 나는 단지 그 오류를 "잡으려고"하고 그 표현을 "실패로 표시"하고 싶지만, 오류를 일으키지 않는 다른 것들은 성공으로 간주 할 것입니다. – mentics

+10

@taotree 오류보고는 올바른 동작입니다. "공황 상태 ('불가능한'상황) '로 인해 충돌이 발생하는 것은 올바른 행동이 아닙니다. 버그로 신고하십시오. –

답변

12

당신은 그것을 처리 할 수 ​​없습니다 - 이것은 'oops'커널과 같아서 런타임이나 컴파일러가 일관성없는 상태에 있음을 의미합니다. 버그로 신고하십시오.