how to catch D Throwables (or exceptions) from C++?
Elie Morisse via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Fri Dec 2 05:46:08 PST 2016
On Friday, 2 December 2016 at 08:13:51 UTC, Jacob Carlborg wrote:
> 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.
Exceptions thrown from D set a different exception class in the
header, and the C++ personality routine (i.e the function that
gets called for each catch block) only handles exceptions which
displays the C++ exception class, so let D exceptions slip
through.
To catch exceptions thrown by D code in C++ I think this would
have to be done by throwing a C++ exception (eventually wrapping
a D class), but this is yet to be implemented.
More information about the Digitalmars-d-learn
mailing list