【发布时间】:2015-10-25 11:07:20
【问题描述】:
我正在使用 GHC API 来解析模块。如果模块包含语法错误,GHC API 会将它们写入标准输出。这会干扰我的程序,它有另一种报告错误的方式。示例会话:
$ prog ../stack/src/Stack/Package.hs
../stack/src/Stack/Package.hs:669:0:
error: missing binary operator before token "("
#if MIN_VERSION_Cabal(1, 22, 0)
^
../stack/src/Stack/Package.hs:783:0:
error: missing binary operator before token "("
#if MIN_VERSION_Cabal(1, 22, 0)
^
../stack/src/Stack/Package.hs
error: 1:1 argon: phase `C pre-processor' failed (exitcode = 1)
应该只输出最后一个。如何确保 GHC API 不输出任何内容?我想避免像 silently 这样的库,它们通过将 stdout 重定向到临时文件来解决问题。
我已经尝试使用GHC.defaultErrorHandler,但是虽然我可以捕捉到异常,但 GHC API 仍然会写入标准输出。相关代码:
-- | Parse a module with specific instructions for the C pre-processor.
parseModuleWithCpp :: CppOptions
-> FilePath
-> IO (Either (Span, String) LModule)
parseModuleWithCpp cppOptions file =
GHC.defaultErrorHandler GHC.defaultFatalMessager (GHC.FlushOut $ return ()) $
GHC.runGhc (Just libdir) $ do
dflags <- initDynFlags file
let useCpp = GHC.xopt GHC.Opt_Cpp dflags
fileContents <-
if useCpp
then getPreprocessedSrcDirect cppOptions file
else GHC.liftIO $ readFile file
return $
case parseFile dflags file fileContents of
GHC.PFailed ss m -> Left (srcSpanToSpan ss, GHC.showSDoc dflags m)
GHC.POk _ pmod -> Right pmod
此外,使用这种方法我无法捕获错误消息(我只收到ExitFailure)。删除带有GHC.defaultErrorHandler 的行会给我上面显示的输出。
【问题讨论】:
标签: haskell error-handling stdout ghc