
Simon Marlow wrote:
Michael Marte wrote:
if a runtime error occurs inside a DLL compiled by ghc (like "irrefutable pattern match failed" or exceptions caused by error), the application that called the DLL function dies. This is ok for development but unacceptable when it happens with a user sitting in front of the display. (It has not yet happened but it's only a question of time.)
So my question is: Is there any way to catch and process runtime errors? I am looking for some way to map those errors to exceptions on the C++ side that can be caught if required. It would be ok to kill the Haskell runtime system and unload the DLL if necessary.
The FFI doesn't provide any way to propagate exceptions from Haskell to the caller of a foreign export, because there's no standard way to do this. It is your responsibility to catch the exception in Haskell and return an appropriate error code to the caller. To raise a C++ exception, you would probably need another C++ wrapper around each foreign export, translating an error code into the C++ exception.
I think my intial problem description should have mentioned that I already have an exception handler: catch (do let result = ... write result to file return 1) (\_ -> return 0) However, this handler catches IO exceptions only! Following the advice from this thread I changed the handler as follows: Control.Exception.catch (do result <- Control.Exception.evaluate (...) write result to file return 1) (\_ -> return 0) This handler actually catches all exceptions. I found that it is important to use Control.Exception.catch, just catch does not work. I do not yet know whether I have to use evaluate. Next thing is to pass the exception messages to the C++ side and I think I know how to achieve this. Michael