[Haskell-cafe] C++ exception (from *.so) catchable by Haskell??

Nick Rudnick nick.rudnick at gmail.com
Fri Feb 14 10:22:28 UTC 2014

Thank you, Peter :-)

The exception specification hint is helpful – now I got it :-) Here,
the exception specification stuff is useful...

OK, I can intercept now, but I see the solution isn't as easy as just
replacing e.g.

void myUnexpected () {
  std::cerr << "unexpected called\n";
  throw 0;


void myUnexpected () {
  std::cerr << "unexpected called\n";

... is it here where Brandon comes in, as the message gets out, but the
whole still carries the original Exception thrown with it – like you can
shoot yourself by your own bullet before the adversary's one arrives you?!?

The test code I have chosen for learning about the problem is hsqml by
Robin Kay, which I consider to be very well done, usually injecting into

extern "C" void hsqml_init(void (*freeFun)(HsFunPtr),
                                 void (*freeStable)(HsStablePtr)
  ) throw() {
  std::set_unexpected (myunexpected);
  throw runtime_error("OOOPS...");

hsqml_init(...), again, is directly called from
Graphics/QML/Internal/BindCore.chs – solely (grep ascertained there is no
other call from the C/C++ code):

{#fun unsafe hsqml_init as hsqmlInit_
    {id `HsFreeFunPtr',
     id `HsFreeStablePtr'} ->
    `()' #}

What puzzles me currently is that, by the descriptions, I would expect that
terminate() actually is replaced by std::cerr, so that the termination
displayed in the result happens afterwards – but where??

In regard of what's my question, there should be something like a
common/best practice,shouldn't it? As I see, catching inside C++ isn't an
issue at all with coarse-grained interfaces, as the overhead doesn't
matter. But I expect there are also some experiences for the case of lots
of calls to do from Haskell to very small C++ jobs – how then? As Alexander
states (just incoming... ;-) there is a pleasing zero runtime approach with
C++ exceptions – great if it that be done via pointer addresses only (i.e.
'virtual Either', addresses that will either point to a 'Left' or 'Right'
instance, but without tag), so there might be no additional overhead...
(though things would go somewhat opaque for the Haskell side)

But is there a practice to do this? If not, would it not mean a certain
overhead to construct/destruct, e.g. Either, lots of time, together with
doing the appropriate conditionals?

If not, there is no issue to worry about. :-)

So my interest is a very practical one – so insn't there hope even in case
there is no standard covering it, as concrete FFI interfacing goes to a
fixed project, let's say Qt4? So experiences might have gathered...

Cheers, Nick

2014-02-14 0:38 GMT+01:00 Peter Simons <simons at cryp.to>:

> Hi Nick,
> please note that the handler set by std::unexpected() fires only if a
> function violates its exception specification, i.e. the function
>   void foobar() throw() { throw 0; }
> would trigger std::unexpected_handler(), but
>   void foobar() { throw 0; }
> does not, because there is no "unexpected" exception. Uncaught exceptions,
> on the other hand, trigger the function std::terminate(), which by default
> translates to std::abort().
> Brandon Allbery pointed this out before, but it's probably worth
> repeating: there is no way to catch (or throw) a C++ exception in Haskell.
> The internal details of C++ exception handling are "implementation
> defined". There is no standard that defines how to implement exceptions,
> which means that you cannot even mix code from different C++ compilers if
> you want to handle exceptions. Mixing in Haskell code is probably next to
> impossible.
> Take care,
> Peter
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20140214/511409b9/attachment.html>

More information about the Haskell-Cafe mailing list