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.
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
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
@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. –