On 2016-12-01 02:58, Timothee Cour via Digitalmars-d-learn wrote:
eg:

```
dlib.d:
extern(C) void dfun(){assert(0, "some_msg");}

clib.cpp:
extern "C" void dfun();
void fun(){
  try{
    dfun();
  }
  catch(...){
    // works but how do i get "some_msg" thrown from D?
  }
}
```

At least for a C++ exception it's possible to get the current exception with __cxxabiv1::__cxa_current_primary_exception(). I verified and it works for C++ exceptions. I would think that the following works for D exceptions, but I cannot even catch the D exception in C++. Maybe it's not working properly on macOS.

// c++
void foo();
const char* getExceptionMessage(void*);

void bar()
{
    try
    {
        foo();
    }
    catch(...)
    {
        void* e = __cxxabiv1::__cxa_current_primary_exception();
        if (e)
        {
            const char* msg = getExceptionMessage(e);
            if (msg)
                printf("%s\n", msg);
            else
                printf("no message\n");
        }
        else
        {
            printf("no exception\n");
        }
    }
}

// d

extern(C++) void foo()
{
    throw new Exception("foo");
}

extern(C++) immutable(char)* getExceptionMessage(void* e)
{
    if (e)
    {
        auto t = cast(Throwable) e;
        return t.msg.ptr;
    }

    return null;
}

I'm compiling the C++ code with clang++ and I need to link with libc++abi.

--
/Jacob Carlborg

Reply via email to