OK, thanks to Luite Stegeman I've found the solution and I think I'll
post it here in case someone else stumbles upon the same problem.
The solution is the following: you have to change 'log_action'
parameter in dynFlags. For example, one can do this:
---
initGhc = do
..
ref - liftIO $ newIORef
dfs - getSessionDynFlags
setSessionDynFlags $ dfs { hscTarget = HscInterpreted
, ghcLink = LinkInMemory
, log_action = logHandler ref}
logHandler :: IORef String - LogAction
logHandler ref dflags severity srcSpan style msg =
case severity of
SevError - modifyIORef' ref (++ printDoc)
SevFatal - modifyIORef' ref (++ printDoc)
_ - return ()
where cntx = initSDocContext dflags style
locMsg = mkLocMessage severity srcSpan msg
printDoc = show (runSDoc locMsg cntx)
-- LogAction == DynFlags - Severity - SrcSpan - PprStyle - MsgDoc - IO ()
---
On Sat, Jun 15, 2013 at 1:26 PM, Daniel F difru...@gmail.com wrote:
Hello, everyone.
I am in need of setting up custom exception handlers when using GHC
API to compile modules. Right now I have the following piece of code:
* Main.hs:
--
import GHC
import GHC.Paths
import MonadUtils
import Exception
import Panic
import Unsafe.Coerce
import System.IO.Unsafe
handleException :: (ExceptionMonad m, MonadIO m)
= m a - m (Either String a)
handleException m =
ghandle (\(ex :: SomeException) - return (Left (show ex))) $
handleGhcException (\ge - return (Left (showGhcException ge ))) $
flip gfinally (liftIO restoreHandlers) $
m = return . Right
initGhc :: Ghc ()
initGhc = do
dfs - getSessionDynFlags
setSessionDynFlags $ dfs { hscTarget = HscInterpreted
, ghcLink = LinkInMemory }
return ()
test :: IO (Either String Int)
test = handleException $ runGhc (Just libdir) $ do
initGhc
setTargets = sequence [ guessTarget ./test/file1.hs Nothing ]
graph - depanal [] False
loaded - load LoadAllTargets
-- when (failed loaded) $ throw LoadingException
setContext (map (IIModule . moduleName . ms_mod) graph)
let expr = main
ty - exprType expr -- throws exception if doesn't typecheck
output ty
res - unsafePerformIO . unsafeCoerce $ compileExpr expr
return res
--
* file1.hs:
module Main where
main = do
return x
The problem is when I run the 'test' function above I receive the
following output:
h test
test/file1.hs:4:10: Not in scope: `x'
Left Cannot add module Main to context: not a home module
it :: Either String Int
So, if I understand this correctly, my exception handler does indeed
catch an exception correctly,
however, I still receive some output which I want to be captured.
Is there a way to do this?
--
Sincerely yours,
-- Daniil Frumin
--
Sincerely yours,
-- Daniil
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe