
If you cannot do it with Haskell exceptions, I guess you need to look how you would do it in plain C in do the same. Keep in mind that if something crashes in a C library, that library might have corrupted (or leaked) any memory it had access to. I guess a somewhat reliable way is to fork an OS process, and run your crashy DLL in that; if it dies, the OS will keep care of cleaning up the low level garbage. On Mon 23 Sep 2013 17:37:49 SGT, Miro Karpis wrote:
Please, can you help me with following: I have an external dll that I'm importing in my haskell program. In some particular cases the dll crashes.
Simplified: first I need to send to dll with MethodA some parameters and then call MethodB to do some calculations on those parameters. If I didn't give enough parameters then MethodB will crash the whole dll and my Haskell application.
Is there a way to handle this? Unfortunately there are no exceptions thrown from the dll.
In ghci I'm getting following message: ERROR in InitNumericalSystem::initializeSystem. JuncLabel.
I have tried to use "catchAny but that didn't help. c_run is my external dll method which takes 4 input parameters:
catchAny :: IO a -> (SomeException -> IO a) -> IO a catchAny = Control.Exception.catch
main :: IO () main = do let timeTot = []::[CDouble] timeNow = []::[CDouble] runType = 2::CInt timeTotPtr <- newArray timeTot timeNowPtr <- newArray timeNow result <- (catchAny $ c_run timeTotPtr runType timeNowPtr 0) $ \e -> do putStrLn $ "Got an exception: " ++ show e putStrLn "Returning dummy value of -1" return (-1) free timeTotPtr free timeNowPtr print result
I have tried also with withAsync, and no luck
tryAny :: IO a -> IO (Either SomeException a) tryAny action = withAsync action waitCatch
catchAny :: IO a -> (SomeException -> IO a) -> IO a catchAny action onE = tryAny action >>= either onE return
try2 :: IO () try2 = do let timeTot = []::[CDouble] timeNow = []::[CDouble] runType = 2::CInt timeTotPtr <- newArray timeTot timeNowPtr <- newArray timeNow putStrLn $ "c_run going to call c_run.." result <- catchAny (c_run timeTotPtr runType timeNowPtr 0) (const $ return (-1)) free timeTotPtr free timeNowPtr putStrLn $ "Result: " ++ show result
Is there a way how I can handle this?
cheers, m.
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe