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
_______________________________________________
Glasgow-haskell-users mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users