【发布时间】:2015-06-25 23:36:32
【问题描述】:
有什么好的方法可以捕获一个haskell异常,这个异常是在一个c函数调用的haskell回调函数中抛出的?
例如,让我有一个简单的 c 函数,它只调用给定的回调,
void callmeback ( void (*callback) () ) {
callback ();
}
还有一个通过 ffi 使用此功能的 haskell 代码。
{-# 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 中捕获。
我怎样才能使这种代码运行良好?
【问题讨论】:
-
我现在在这里问一个半相关的问题:stackoverflow.com/questions/29725324/… - 这对我不起作用,但我认为它可能对你有用......看看@987654329 @package 看看能不能给你带来好运:hackage.haskell.org/package/enclosed-exceptions
-
这篇博文是我读到的,可能会提供一些更有用的信息:fpcomplete.com/user/snoyberg/general-haskell/exceptions/…