Есть ли хороший способ поймать исключение haskell, которое вызывается функцией обратного вызова haskell, вызываемой функцией c?
Например, пусть у меня есть простая функция c, которая просто вызывает заданный обратный вызов,
void callmeback ( void (*callback) () ) {
callback ();
}
и код haskell, который использует эту функцию через ffi.
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE ForeignFunctionInterface #-}
module Main (main) where
import Foreign
import Control.Exception
import Data.Typeable
foreign import ccall safe "wrapper"
mkCallback :: IO () -> IO (FunPtr (IO ()))
foreign import ccall safe "callmeback"
callmeback :: FunPtr (IO ()) -> IO ()
data AnError = AnError String deriving (Show, Eq, Typeable)
instance Exception AnError
callback :: IO ()
callback = throwIO $ AnError "Catch me."
callMeBack :: IO () -> IO ()
callMeBack f = do fp <- mkCallback f
callmeback fp
main = do callMeBack callback `catch`
(\ e -> do putStrLn $ show (e :: AnError)
putStrLn "I caught you." )
putStrLn "-- Happy end."
Результат выполнения (компиляция с помощью GHC 7.8.2) выглядит следующим образом:
% ./Catch
Catch: AnError "Catch me."
Таким образом, похоже, что исключение, созданное в callback
, не может быть перехвачено в main
. Как я могу заставить этот вид кода работать хорошо?
enclosed-exceptions
и посмотрите, принесет ли это вам удачу: hackage.haskell.org/package/enclosed-exceptions а> - person TheCriticalImperitive   schedule 19.04.2015