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